You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++传递2D数组代码用MingW编译报terminate called recursively错误原因

问题原因

你代码的核心错误是堆缓冲区溢出,属于C/C++中的未定义行为,这就是不同环境运行表现不一致的原因:

  • 你为每一行数组申请的长度是n=2,仅能合法访问下标j=0和j=1的元素
  • 但你给数组赋值的内层循环使用了for(int j=0; j<m; j++),m=3会让j遍历到2,访问arr[i][2]属于越界写操作,会破坏堆上的内存布局
  • 在线编译器运行时刚好越界写的位置没有触发系统内存保护,所以看起来运行正常;你的本地MinGW环境下堆结构被破坏后,后续执行触发异常,就报了terminate called recursively的错误

修复方案

把main函数中赋值的内层循环边界从j < m改为j < n即可。

修正后的完整代码

#include <iostream>
using namespace std;

void printMat(int **arr, int m, int n)
{
    for(int i=0; i<m; i++)
        for(int j=0; j<n; j++)
            cout<<arr[i][j]<<" ";
}

int main()
{
    int m=3, n=2;

    int **arr;
    arr = new int *[m];

    for(int i=0; i<m; i++)
    {
        arr[i] = new int[n];
        // 修正循环边界
        for(int j=0; j<n; j++)
        {
            arr[i][j]=i;
            cout<<arr[i][j]<<" ";
        }
    }
    cout<<"Reached"<<endl;
    printMat(arr, m, n);

    // 补充内存释放逻辑,避免内存泄漏
    for(int i=0; i<m; i++)
    {
        delete[] arr[i];
    }
    delete[] arr;
    return 0;
}

额外提示

未定义行为没有固定的错误表现,不能因为代码在某一个环境能正常运行就判定代码没有问题,遇到跨环境运行结果不一致的情况优先排查内存越界、野指针这类未定义行为问题。

内容的提问来源于stack exchange,提问作者Vamsi Krishna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:18:05