关于C++记忆的事情

something about memory in C++

本文关键字:记忆 C++ 关于      更新时间:2023-10-16

可能的重复项:
大型阵列大小的分段错误

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

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

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

恭喜,您发现了堆栈溢出。

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

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

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

第三个示例比较棘手,因为它似乎应该导致与第一个示例相同的情况,但编译器可能优化了函数,因为它认为该函数中没有进行有意义的工作(因此没有为局部变量分配内存)