C 阵列&;分段故障

C 阵列&;分段故障,c,linux,ubuntu,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年后流产?如何检查操作系统为阵列

我正在创建以下阵列:

int p[100];
int
main ()
{
    int i = 0;
    while (1)
    {
        p[i] = 148;
        i++;
    }
    return (0);
}
在写入阵列的1000个位置(而不是100个位置)后,程序因分段错误而中止。我知道C不会检查程序是否写越界,这由操作系统决定。我在ubuntu上运行它,堆栈的大小是8MB(limit-s)。为什么它会在1000年后流产?如何检查操作系统为阵列分配的内存量?
抱歉,如果以前有人问过这个问题,我已经在谷歌上搜索过了,但似乎找不到具体的解释。

访问无效的内存位置会导致任何事情都可能发生。不必出现分段错误。

一旦CPU说

嘿!那不是你的记忆,别管了

内存不在数组中这一事实并不意味着应用程序不能对其进行操作

在写入阵列的1000个位置(而不是100个位置)后,程序因分段错误而中止


您不能推理出未定义的行为。这就像问如果1000人在一棵椰子树下,如果一颗椰子砸到他们的头,他们中的70000人会不会总是不省人事?

看起来你显然超过了定义的100个元素(
int p[100];
),因为你做了一个循环,没有任何限制(
while(1)

我建议您改用
for
循环:

for (i = 0; i < 100; i++) {
  // do your stuff...
}
(i=0;i<100;i++)的
{
//做你的事。。。
}

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

…堆栈的大小是8MB(限制-s)

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


如其他所述,使用
p[i]=148您产生了未定义的行为。填充1000个位置时,您很可能到达BSS区域的末尾并出现分段错误。

这只是UB,不要试图对此进行推理。return语句中的括号是多余的,就像您在赋值中使用它们一样<编码>p[i]=(148)这意味着在问题发生的确切位置有一个无效的内存访问,因此不一定是1000,但在您的情况下是1000,可能是981或123。这就像问:“如果我在高速公路上跑来跑去,为什么我没有立即被车撞到?我设法跑了10分钟,最后一辆车撞到了我。”分析原因是没有意义的。也许那天交通不太拥挤。也许你穿着五颜六色的衣服。也许你跑得很快。谁在乎呢?这不是有用的知识。简单地说,不要在高速公路上跑来跑去,你会没事的。嗨,谢谢你的回答,我的问题是,既然我在1000后一直出现分段错误,那么在创建数组时,有没有办法检查我的SO分配是什么?或者这将取决于许多因素(其他正在运行的程序,等等)。很抱歉,你一直误用这个词,因为你在任何时候都可能有不同的行为!指令
int p[100]
分配的内存为
sizeof(int)*100
(字节)