我刚刚注意到这一点,想知道是否有办法防止它,
我从用户那里获取一个整数,然后使用该整数分配数组大小,如下所示:
int main(void){
int num;
int *array;
printf("Enter num: ");
scanf("%d",&num);
array = malloc(sizeof(int)*num);
array[100]=123
printf("%d",array[100]);
}
如果在运行时输入 4 作为数字,我仍然可以在 array[100] 中打印值。这不是我想要的,有没有更好的方法来动态分配和防止这个问题。我觉得如果我以后在我的代码中犯了错误,这可能会导致溢出问题
在阅读或写入之前进行测试就可以了。 在您的情况下 - 请注意使用无效索引读取或写入数组会产生未定义的行为
if (num > 100)
{
array[100]=123;
printf("%d",array[100]);
}
但是,如果你没有显式地做一些事情来确保索引是有效的(我已经用num > 100
测试来说明,但还有其他方法可以做到这一点(,那么 C 中没有任何内容可以防止对数组元素的无效访问 - 无论它们是否使用 malloc()
动态分配。
如果你想为你提供这样的安全网(即你不想费心去确保你使用的数组索引是有效的,并期望语言/编译器/主机为你解决问题(,那么你将需要一种语言而不是C。
此外,您可能希望检查num
是否为正数,因为如果malloc()
为零或负数,则会给出意外的结果。 同样,如果失败,malloc()
返回NULL
,您应该在使用之前检查返回的指针,而不是依赖它是否有效。
只需添加简单的 If 语句。防止卵流。
if(num>100)
array[100]=123;
printf("%d",array[100]);
else
{
// what else you want to be done
}
小心!数组始终从array[0]
元素开始。因此,如果您分配ptrArray = malloc(sizeof(int)*100);
它将分配一个从 0 到 99 的 100 个元素的数组。在此上下文中array[100]
元素已经是溢出,并可能导致未定义的行为 - 这不是好:)
有没有更好的方法来动态分配和防止这个问题
不。
如果您不知道 100 是否是有效的索引,请不要写array[100]=
。