以下是我想了解的代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int main()
{
int *ptr = (int *)malloc(5 * sizeof(int)),i;
for(i=0;i<MAX;i++)
{
ptr[i] = i;
}
for(i=0;i<MAX;i++)
{
printf("%d\n",ptr[i]);
}
return 0;
}
我的问题:我分配了5 * int大小的内存,但为什么需要超过5个ineteger? 日Thnx
答案 0 :(得分:4)
您为5个整数保留了空间。对于其他95个整数,您正在写入为其他目的保留的空间。您的程序可能会崩溃,也可能不会崩溃,但您应该预期它会以某种方式失败。
答案 1 :(得分:2)
它不“超过”5个整数;你只是调用未定义的行为。即使您看到代码在您的实现上有效,您也不能指望代码“成功”。
答案 2 :(得分:2)
它不是'取'超过5个整数:你分配了5 * sizeof(int)
并通过访问超过这个大小的内存来调用未定义的行为。
毫无疑问,您是否应该将MAX
设置为10,1024或100000:代码基本上是错误的,并且在运行它时它没有失败这一事实并没有减少错误。像valgrind
这样的工具可以帮助您发现此类错误。
答案 3 :(得分:1)
即使您只分配了5个整数,您仍然可以保护页面的其余部分不受保护。这就是缓冲区溢出和许多程序错误行为的发生方式
我打赌如果你的MAX设置为1025,你会有段错误(假设这是你的程序)
答案 4 :(得分:1)
C不对数组执行边界检查。如果你有一个5元素数组,C很乐意让你分配给arr[5]
,arr[100]
,甚至是arr[-1]
。
如果你很幸运,这只会覆盖未使用的内存,无论如何你的程序都会正常工作。
如果你运气不好,你将覆盖程序中的其他变量,malloc
的元数据或操作系统,以及坏事将会发生。习惯于看到短语“分段错误”。