C++二维数组输入m、n大于5时输出随机错误值的原因及修复
问题根因
代码存在三个叠加触发异常的问题,m、n大于5时输出随机乱值是问题集中爆发的表现:
- 符号书写错误:
a[0][0] == 1;这行用了相等比较运算符==,并非赋值操作,执行完后a[0][0]没有被写入任何有效值,保留的是栈内存里残留的随机垃圾值。 - 非标准语法导致内存溢出:
int a[m][n]属于可变长度数组(VLA),不是C++标准支持的合法语法,只是GCC等编译器提供的非标准扩展。这种数组直接分配在程序栈空间上,系统给进程栈分配的默认空间通常只有1~8MB,当m、n增大到一定阈值(此场景下为大于5),数组占用空间超过栈剩余容量就会触发栈溢出,直接覆盖栈上存储的k、i、j等循环变量甚至函数返回地址,所有变量值被篡改后自然输出随机乱码。 - 逻辑缺失:整个代码除了那行写错的赋值语句,从未给数组a的任何位置写入有效值,循环输出时也没有读取当前遍历位置
a[i][j]的内容,全程依赖未初始化的a[0][0]做计算,就算不触发栈溢出,输出结果也和预期的数组填充逻辑完全不符。
修复方案
- 删掉非标准的栈上可变长度数组,改用C++标准库提供的
vector容器存储二维数组,内存分配在堆上,从根源避免栈溢出问题。 - 修正符号错误,补全数组每个位置的赋值逻辑,禁止读取未初始化的内存值参与计算。
- 调整输出逻辑,遍历到哪个位置就计算、输出哪个位置的结果,不要固定读取
a[0][0]的值。
修复后可正常运行的代码如下:
#include <iostream> #include <vector> using namespace std; int main() { int t; cin >> t; while(t--) { int m, n; cin >> m >> n; vector<vector<int>> a(m, vector<int>(n)); int k = 1; for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ a[i][j] = 1 + k * (j + 1); cout << a[i][j] << " "; } k += 2; cout << '\n'; } } return 0; }
内容的提问来源于stack exchange,提问作者Rajdeep Das
相关产品推荐
相关产品推荐

