关于C ++内存的一些东西

时间:2012-06-10 14:25:38

标签: c++ memory

  

可能重复:
  Segmentation fault on large array sizes

运行程序时发生分段错误。

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

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

2 个答案:

答案 0 :(得分:9)

恭喜,您找到了stack overflow

在第一个示例中,大型数组xy推送到堆栈末尾,因此访问它会导致程序崩溃。 (2)不会崩溃,因为您声明的大型数组位于数据段中,因此不在堆栈中; (3)不会崩溃,因为你实际上没有访问堆栈末尾的内存(你已经声明它,但没有读取或写入它)。

答案 1 :(得分:2)

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

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

第三个例子比较复杂,因为它看起来应该会导致与第一个相同的情况,但是你的编译器可能优化了函数,因为它认为在该函数中没有进行任何有意义的工作(所以没有内存)局部变量的分配)

相关问题