C++二维数组Windows运行崩溃Linux正常,疑内存限制求解决方案
你的猜测完全正确,问题确实出在Windows的栈内存限制上!
先给你算笔账:你定义的double name[512][512]总共有512×512=262144个元素,每个double占8字节,加起来就是2MB左右。
而Windows系统下,程序的栈内存默认大小通常只有1MB(比如VS编译器的默认设置就是这样),你这个数组直接放在栈上,瞬间就把栈撑爆了,自然会运行崩溃;反观Linux,默认栈大小一般是8MB左右,2MB完全在承受范围内,所以能正常运行。
下面给你几个实用的解决办法:
把数组移到全局作用域:全局变量存在静态存储区,这里的空间限制远小于栈。只要把数组定义在函数外面(比如main函数之前)就行:
double name[512][512]; // 存放在全局区,不会触发栈溢出 int main() { // 正常使用数组即可 return 0; }使用动态内存分配:用
new或者STL的vector分配堆内存,堆的可用空间比栈大得多,完全能满足需求:
最推荐用vector(不用手动管理内存,避免泄漏):#include <vector> int main() { std::vector<std::vector<double>> name(512, std::vector<double>(512)); // 正常使用数组 return 0; }也可以用
new手动分配(记得用完要释放内存):int main() { double** name = new double*[512]; for (int i = 0; i < 512; ++i) { name[i] = new double[512]; } // 使用数组的逻辑代码 // 释放内存 for (int i = 0; i < 512; ++i) { delete[] name[i]; } delete[] name; return 0; }调整编译器栈大小(不推荐):如果你一定要在栈上用这个数组,可以在VS里修改项目的栈大小设置(比如改成4MB),但这种方法移植性极差,换编译器或系统就失效了,而且过大的栈也可能引发其他问题,所以优先考虑前两种方案。
内容的提问来源于stack exchange,提问作者Daniel Contreras
相关产品推荐
相关产品推荐

