数组&分段故障

时间:2015-03-26 12:31:07

标签: c linux ubuntu

我正在创建以下数组:

int p[100];
int
main ()
{
    int i = 0;
    while (1)
    {
        p[i] = 148;
        i++;
    }
    return (0);
}

程序在写入数组的1000个位置而不是100之后中止了分段错误。我知道C不会检查程序是否写出越界,这是留给操作系统的。我在ubuntu上运行它,堆栈的大小是8MB(limit -s)。它为什么在1000后流产?如何查看操作系统为阵列分配的内存量? 很抱歉,如果之前有人问过,我一直在谷歌搜索,但似乎无法找到具体的解释。

5 个答案:

答案 0 :(得分:1)

访问无效的内存位置会导致Undefined Behavior,这意味着任何事情都可能发生。没有必要发生分段错误。

答案 1 :(得分:0)

一旦CPU说

,它就会失败
  

HEY!那不是你的记忆,离开吧!

内存不在数组内部的事实并不意味着它不适合应用程序操作。

答案 2 :(得分:0)

  

在编写阵列的1000个位置而不是100之后,程序以分段错误中止。

您没有推理未定义的行为。就像问If 1000 people are under a coconut tree, will 700 hundred of them always fall unconscious if a Coconut smacks each of their heads?

一样

答案 3 :(得分:0)

您可以清楚地获得超过定义的100个元素(int p[100];),因为您创建循环没有任何限制(while (1)

我建议您使用for循环代替:

for (i = 0; i < 100; i++) {
  // do your stuff...
}

关于内存的更具体问题,请考虑任何外部范围请求(在您的情况下超过数组的100个元素)都会产生错误。您注意到在您的情况下它是1000的事实可能会根据其他程序的内存使用情况而改变。

答案 4 :(得分:0)

...堆栈大小为8MB(limit -s)...

变量int p[100];不在堆栈中,而是在数据区中,因为它被定义为全局。它没有被初始化,所以它被放入BSS区域并用零填充。您可以在main()函数的开头检查打印数组值。

正如其他人所说,使用p[i] = 148;您产生了未定义的行为。填充1000位置你最有可能到达BSS区域的末端并且出现分段错误。