我想知道为什么其中一些程序会抛出段错误,而另一些则不会。
这个程序抛出一个段错误:
#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) 您达到该限制并发生堆栈溢出。
关于c 受 printf 影响的最大数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42184970/