我正在创建以下数组:
int p[100];
int
main ()
{
int i = 0;
while (1)
{
p[i] = 148;
i++;
}
return (0);
}
程序在写入数组的1000个位置而不是100之后中止了分段错误。我知道C不会检查程序是否写出越界,这是留给操作系统的。我在ubuntu上运行它,堆栈的大小是8MB(limit -s)。它为什么在1000后流产?如何查看操作系统为阵列分配的内存量? 很抱歉,如果之前有人问过,我一直在谷歌搜索,但似乎无法找到具体的解释。
答案 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区域的末端并且出现分段错误。