我刚刚注意到这一点,想知道是否有办法防止它,
我从用户那里获取一个整数,然后使用该整数分配数组大小,如下所示:
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
,并且您应该在使用它之前检查返回的指针,而不是依赖它是否有效。
关于c - 关于 malloc() : writing outside of allocated memory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35097415/