我想知道为什么其中一些程序会抛出一个段错误,而其他程序却没有。
这个程序引发了一个段错误:
#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个?
由于
答案 0 :(得分:4)
由于实现原因,局部变量(包括数组)存储在堆栈中。函数调用也会添加到堆栈中,既包含一些元信息,也包含被调用函数的局部变量。这一切都加起来。
现在,堆栈是一种有限的资源,例如在Windows上,默认的进程堆栈大小只有一个MB。
在Linux上(我假设您使用,因为您提及&#34;分段错误&#34;)默认堆栈大小为8MB,堆栈上有两百万个四字节整数(sizeof(int)
通常4)您达到了该限制并且堆栈溢出。
答案 1 :(得分:1)
您已在本地申报。存储器的堆栈部分中的本地数组存储和堆栈的大小是有限的。因此,当您给出大于堆栈的大小时,您会得到分段错误。它也被称为堆栈溢出问题。
要拥有更大的数组,您需要将其声明为静态变量或文件范围。
static int ar[2096263]; // This works fine.