int main()
{
int *p=NULL;
p=malloc(8);
if (p==NULL)
printf("Mem alloc failed\n");
else
printf("Passed\n");
unsigned long int i=0;
for (i=2;i<=10000;i++)
p[i]=10; // I thought as we are increasing beyond malloc size of 8 bytes there should be segmentation fault but I was wrong.
printf("p[10000]= %d %d\n",p[10000]);
free(p);
return 0;
}
当我尝试将循环次数增加到
时,这可能是什么原因pow(2,32) ( for(i=2;i<=((pow(2,32)-1));i++))
在哪种情况下我会出现分段错误?
答案 0 :(得分:2)
无法保证实际发生崩溃。这种错误经常被默默地忽略。甚至可以写入用于存储运行时内存管理系统内部结构的内存,从而破坏堆。毕竟,这是未定义的行为 - 没有任何保证。
无论如何,防止堆溢出一般是广泛研究的主题。显然,在这个时刻它是可能的,但显着降低了性能。尝试谷歌搜索&#34;堆溢出保护&#34;如果您觉得这个主题很有趣,您可能会发现有关最新技术和当前发展的各种论文和技术说明。
答案 1 :(得分:1)
你在这里描述的是一个undefined behavior,可能会导致异常,可能会被忽略,并且可能会做任何事情,因为行为是未定义的:
行为,例如在使用错误的程序结构或错误数据时可能出现的行为,本国际标准强加无要求。
此时也可能会出现未定义的行为 国际标准省略了对行为的任何明确定义的描述。