【问题标题】:No segmentation fault when assignement increases beyond malloc size [duplicate]当分配增加到超过 malloc 大小时没有分段错误[重复]
【发布时间】:2013-09-11 07:15:01
【问题描述】:
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;
}

当我试图将 for 循环计数增加到

pow(2,32) ( for(i=2;i<=((pow(2,32)-1));i++))

在什么情况下会出现分段错误?

【问题讨论】:

  • 期望会发生什么?永远记住,“什么都没有发生”是未定义行为的一种可能结果。
  • “我认为当我们的 malloc 大小超过 8 字节时,应该会出现分段错误”——您为什么这么认为?您是否了解什么是段错误、导致它的原因以及 malloc 和它使用的操作系统支持如何工作?你为什么停在10000?

标签: c overflow


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    当这 国际标准省略了对行为的任何明确定义的描述。

    【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 2021-01-06
    相关资源
    最近更新 更多