2

可能重复:
大数组大小的分段错误

运行程序时出现分段错误。

#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;
}

我很困惑。谁能告诉我为什么?

4

2 回答 2

9

恭喜,您发现了堆栈溢出

在第一个示例中,大数组xy入堆栈末尾,因此访问它会使程序崩溃。(2) 不会因为您声明的大数组在数据段中而不在堆栈中而崩溃;(3) 不会崩溃,因为您实际上并没有访问堆栈末尾之后的内存(您已经声明了它,但没有读取或写入它)。

于 2012-06-10T14:30:08.023 回答
2

在您的第一个示例中,您尝试在堆栈上分配 20,000*20,000*4 字节(假设为 32 位整数)。这相当于大约 16MB 的数据,比编译器为您分配的堆栈大小(通常约为 1MB)还多,因此您的(堆栈)内存不足

在第二个示例中,编译器将内存分配给x一个单独的全局空间(不在堆栈上),该空间有足够的空间来容纳它。

第三个例子比较棘手,因为它看起来应该导致与第一个相同的情况,但是您的编译器可能优化了该函数,因为它认为该函数中没有进行任何有意义的工作(因此没有为局部变量)

于 2012-06-10T14:30:47.527 回答