当分配增加超出malloc大小时,没有分段错误

时间:2013-09-11 07:15:02

标签: c overflow

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++))

在哪种情况下我会出现分段错误?

2 个答案:

答案 0 :(得分:2)

无法保证实际发生崩溃。这种错误经常被默默地忽略。甚至可以写入用于存储运行时内存管理系统内部结构的内存,从而破坏堆。毕竟,这是未定义的行为 - 没有任何保证。

无论如何,防止堆溢出一般是广泛研究的主题。显然,在这个时刻它是可能的,但显着降低了性能。尝试谷歌搜索&#34;堆溢出保护&#34;如果您觉得这个主题很有趣,您可能会发现有关最新技术和当前发展的各种论文和技术说明。

答案 1 :(得分:1)

你在这里描述的是一个undefined behavior,可能会导致异常,可能会被忽略,并且可能会做任何事情,因为行为是未定义的:

  

行为,例如在使用错误的程序结构或错误数据时可能出现的行为,本国际标准强加无要求

     

此时也可能会出现未定义的行为   国际标准省略了对行为的任何明确定义的描述。