我想知道为什么其中一些程序会抛出段错误,而另一些则不会。
此程序抛出一个段错误:
#include <stdio.h>
int main(){
int ar[2096263];
printf("asdf");
}
这个没有:
#include <stdio.h>
int main(){
int ar[2096263];
}
此程序不会:
#include <stdio.h>
int main(){
int ar[2096262];
printf("asdf");
}
这个确实:
#include <stdio.h>
int main(){
int ar[2096262];
printf("asdf");
printf("asdf");
printf("asdf");
printf("asdf");
printf("asdf");
}
这个没有:
#include <stdio.h>
int main(){
int ar[2096262];
printf("asdf");
printf("asdf");
printf("asdf");
printf("asdf");
}
我不明白为什么调用 printf 会改变我可以在 main 中拥有的数组大小的限制。另外,为什么数组中不能有超过 2096262 个整数?
谢谢
由于实现原因,局部变量(包括数组(存储在堆栈上。函数调用也会添加到堆栈中,既包含一些元信息,也包含被调用的函数局部变量。这一切加起来。
现在,堆栈是有限的资源,例如,在 Windows 上,默认进程堆栈大小仅为单个 MB。
在 Linux(我假设您使用,因为您提到"分段错误"(默认堆栈大小为 8MB,并且堆栈上有 200 万个四字节整数(sizeof(int)
通常是 4(,您达到了该限制并出现堆栈溢出。
您已在本地声明。本地数组存储在堆栈部分的内存和堆栈大小是 limited.so 的,当你给出的大小超过堆栈时,你会得到分段错误。这也称为堆栈溢出问题。
要拥有更大的数组,您需要将其声明为静态变量或在文件范围内。
static int ar[2096263]; // This works fine.