C++二维数组行列差值大于1时报错无法打印,该如何排查解决?
问题排查与修复说明
错误原因梳理
- 二维数组访问下标颠倒,触发越界
你声明的matr是rows行cols列的动态二维数组,访问规则为matr[行下标][列下标],行下标合法范围是0~rows-1,列下标合法范围是0~cols-1。你在赋值循环中将行列下标写反,用遍历列范围的i作为行下标,遍历行范围的j作为列下标,当行数和列数差值大于1时,很容易出现行下标超过rows-1的情况,直接访问非法内存。 - 野指针操作触发访问违例
代码中int **ptr = &matr[rows*cols];是完全非法的:matr仅存储了rows个行指针,合法下标最大为rows-1,访问rows*cols位置已经是不属于你程序的野地址,后续对*ptr赋值、**ptr解引用都是操作非法内存,这就是VS报read access violation的直接原因,该报错的含义就是程序尝试读取了没有访问权限的内存地址。 - 行反转逻辑错误
你要实现行顺序反转,只需要倒序遍历行下标即可,不需要额外定义指针做冗余操作。
修正后的代码
#include <stdio.h> #include <iostream> #include <time.h> using namespace std; int main() { int r; int rows; int cols; cout << "how many rows: "; cin >> rows; cout << "\n"; cout << "how many columns: "; cin >> cols; cout << "\n"; // 初始化随机数种子,否则每次运行生成的随机数都相同 srand((unsigned int)time(NULL)); int** matr = new int* [rows]; for (int i = 0; i < rows; i++) { matr[i] = new int[cols]; } // 赋值修正,行下标用遍历行数的变量,列下标用遍历列数的变量 for (int j = 0; j < rows; j++) { cout << "\n"; for (int i = 0; i < cols; i++) { r = rand() % 50 - rand() % 50; matr[j][i] = r; cout << matr[j][i] << " "; } } cout << "\n\n反转行顺序后:\n"; // 行反转逻辑,直接倒序输出每行即可 for (int j = rows-1; j >= 0; j--) { cout << "\n"; for (int i = 0; i < cols; i++) { cout << matr[j][i] << " "; } } cout << "\n"; // 补充:释放动态申请的内存,避免内存泄漏 for (int i = 0; i < rows; i++) { delete[] matr[i]; } delete[] matr; return 0; }
补充注意事项
动态申请的数组使用完后需要手动释放,否则会出现内存泄漏;如果需要每次运行生成不同的随机数,需要调用srand设置随机数种子。
内容的提问来源于stack exchange,提问作者Harl23
相关产品推荐
相关产品推荐

