当我选择大于720的矩阵大小时,程序将带错误代码退出。原因可能是什么? 我试图在C++中运行下面的代码,在每次迭代中打印数字,但它返回的值为:1.073。

当我选择大于720的矩阵大小时,程序将带错误代码退出。原因可能是什么? 我试图在C++中运行下面的代码,在每次迭代中打印数字,但它返回的值为:1.073。,c++,g++,C++,G++,当n小于720时,它工作 int main() { int n = 820; double xy[n][n]; double k = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; j++) { xy[i][j] = k; k++; cout << xy[i][j] << en

n
小于720时,它工作

int main() {
    int n = 820;
    double xy[n][n];
    double k = 0;

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; j++) {
            xy[i][j] = k;
            k++;
            cout << xy[i][j] << endl;
        }
    }
    return 0;
}
intmain(){
int n=820;
双xy[n][n];
双k=0;
对于(int i=0;icout本地变量,如
double xy[n][n]
存储在堆栈上。在您的情况下,分配的内存超过5 MB,这超过了某些操作系统上的默认堆栈大小。如注释中所述,这将导致堆栈溢出

有两种解决方案:

  • 使用链接器设置增加要为程序分配的堆栈大小。不建议这样做,因为堆栈是在程序的整个运行时分配的

  • 在堆上分配数组变量,最好使用STL容器,例如
    std::vector xy;


  • 尝试在堆上而不是堆栈上创建内存。此代码可能会有所帮助

    double **dd = new double*[n];
    for(int i = 0;i<n;i++){
        dd[i] = new double[n];
     }
    
    double**dd=new double*[n];
    
    对于(int i=0;iA堆栈溢出?我建议不要使用GCC的VLA特性,而是使用
    std::vector
    @πάνταῥεῖ 它不返回任何描述符它可能是堆栈溢出。您希望使用堆栈中的2689600字节(820 x 820 x 4)使用编译器选项来增加堆栈。@SuperHornet我自由地改进了你的问题标题。我不推荐
    std::vector
    。大小
    w*h
    的普通
    std::vector
    可能更好。(在本例中,嵌套向量的唯一优点是方便的索引语法,但如果您非常需要这种语法,那么正确的做法是围绕一维向量编写包装。)@HolyBlackCat:性能更好,是的,可能更好。可读性更好,可能不更好。增加编译器的堆栈大小不会有什么区别。指示链接器生成可执行映像,命令操作系统加载程序分配更大的堆栈,但会起作用:)@ MartinJames:对,我已经编辑了我的答案,这是一个可怕的建议。考虑到C++支持任何类型的容器和智能指针,很少有真正需要在代码中使用“<代码>新< /C> >和<代码>删除>代码>的情况。Clealy您面临堆栈溢出错误。n,因为你需要在堆中分配数组而不是栈。但是,当问题是标记C++时,标准库有比你在例子中建议的更好的方法。注意C++语言标准甚至没有堆栈或堆的概念。当你在任何组织工作时,你不必在STAC上做任何事情。K,这是最糟糕的编程实践。你需要堆。我一直在使用动态内存分配。你没有明白我的意思,我说C++比直接使用<代码>新< /代码>提供更好的方法。更不用说了。