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

在这种情况下我会遇到分段错误?

4

2 回答 2

2

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

无论如何,防止堆溢出通常是一个广泛研究的主题。显然,此时这是可能的,但会显着降低性能。如果您发现该主题很有趣,请尝试在谷歌上搜索“堆溢出保护”,您可能会找到关于最先进技术和当前发展的各种论文和技术描述。

于 2013-09-11T07:19:08.997 回答
1

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

行为,例如在使用错误程序结构或错误数据时可能出现的行为,本国际标准对此没有任何要求

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

于 2013-09-11T07:21:19.623 回答