运行程序时发生分段错误。
#include<iostream>
using namespace std;
int main(){
int x[2000][2000];
int y;
cin >> y;
}
但是,当我运行它们时,以下两个程序都可以。
#include<iostream>
using namespace std;
int x[2000][2000];
int main(){
int y;
cin >> y;
}
和
#include<iostream>
using namespace std;
int main(){
int x[2000][2000];
int y;
}
我很困惑。谁能告诉我为什么?
答案 0 :(得分:9)
恭喜,您找到了stack overflow。
在第一个示例中,大型数组x
将y
推送到堆栈末尾,因此访问它会导致程序崩溃。 (2)不会崩溃,因为您声明的大型数组位于数据段中,因此不在堆栈中; (3)不会崩溃,因为你实际上没有访问堆栈末尾的内存(你已经声明它,但没有读取或写入它)。
答案 1 :(得分:2)
在第一个示例中,您尝试在堆栈上分配20,000 * 20,000 * 4个字节(假设32位整数)。这相当于大约16MB的数据,这超过了编译器为您分配的堆栈大小(通常大约1MB),因此耗尽(堆栈)内存
在第二个示例中,编译器在单独的全局空间(不在堆栈中)为x
分配内存,该空间有足够的空间来容纳它。
第三个例子比较复杂,因为它看起来应该会导致与第一个相同的情况,但是你的编译器可能优化了函数,因为它认为在该函数中没有进行任何有意义的工作(所以没有内存)局部变量的分配)