C++使用for循环输入二维数组时代码无法进入计算环节求助
异常原因
- 数组下标越界访问:C/C++的数组索引从0开始计数,你定义的
int arr[dim1][dim2]第一维合法索引范围是0 ~ dim1-1,第二维合法索引范围是0 ~ dim2-1。你的循环逻辑使用i=1; i <= dim1、j=1; j <= dim2的遍历规则,当i等于dim1、j等于dim2时已经超出数组的合法访问边界,触发未定义行为,会出现程序卡死、数据乱码、直接崩溃等问题,自然无法执行后续计算逻辑。 - 使用非标准C++特性:C++标准不支持运行时变量作为静态数组的长度,
int arr[dim1][dim2]属于C99引入的变长数组(VLA)特性,仅部分编译器(如GCC)作为非标准扩展支持,代码兼容性很差;同时静态数组分配在栈空间,若dim1、dim2数值较大,会直接触发栈溢出。
修复方案
调整遍历索引的起始和终止条件,同时使用C++标准的动态容器替代非标准的变长数组,修复后的完整代码如下:
#include <iostream> #include <vector> using namespace std; int main() { int dim1, dim2; cout << "Enter first dimension: "; cin >> dim1; cout << endl << "Enter second dimension: "; cin >> dim2; // 用vector构造二维动态数组,兼容所有标准C++编译器 vector<vector<int>> arr(dim1, vector<int>(dim2)); // 索引从0开始遍历 for (int i = 0; i < dim1; i++) { for (int j = 0; j < dim2; j++) { cin >> arr[i][j]; } } for (int i = 0; i < dim1; i++) { for (int j = 0; j < dim2; j++) { cout << arr[i][j] << ' '; } cout << endl; } // 后续计算逻辑可在此处添加 return 0; }
如果需要使用原生指针实现动态二维数组,也可以使用以下方式:
#include <iostream> using namespace std; int main() { int dim1, dim2; cout << "Enter first dimension: "; cin >> dim1; cout << endl << "Enter second dimension: "; cin >> dim2; // 手动申请二维动态数组 int **arr = new int*[dim1]; for (int i = 0; i < dim1; i++) { arr[i] = new int[dim2]; } for (int i = 0; i < dim1; i++) { for (int j = 0; j < dim2; j++) { cin >> arr[i][j]; } } for (int i = 0; i < dim1; i++) { for (int j = 0; j < dim2; j++) { cout << arr[i][j] << ' '; } cout << endl; } // 使用完手动释放内存,避免泄漏 for (int i = 0; i < dim1; i++) { delete[] arr[i]; } delete[] arr; // 后续计算逻辑可在此处添加 return 0; }
内容的提问来源于stack exchange,提问作者King Kint 2016
相关产品推荐
相关产品推荐

