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
相关产品推荐
相关产品推荐

