C++二维动态数组随机赋值函数报错求助:arr[i][j]索引异常
C++二维数组操作隐性错误分析与修复
核心问题
你的代码存在多个关键问题,直接导致第12行和第22行的索引操作出现未定义行为:
- 函数参数类型不匹配:
FillArray和PrintArray的参数定义为int arr[],实际会退化为int*类型,但你在main中创建的是int**类型的动态二维数组。用一维指针执行二维索引(arr[i][j])会破坏内存结构,引发隐性错误。 - 函数调用传参错误:调用
FillArray(*arr, rows, cols)时,*arr仅指向二维数组的第一行(int*类型),无法代表整个二维数组,导致后续行的访问完全越界。 - main函数返回类型违规:C++标准要求
main函数的返回类型必须是int,而非void,这会导致编译错误。 - 内存释放不规范:释放指针数组
arr时需使用delete[]而非delete,否则会造成内存泄漏。
修复后的完整代码
#include <iostream> #include <ctime> using namespace std; void FillArray(int** arr, int rows, int cols) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { arr[i][j] = rand() % 10; } } } void PrintArray(int** arr, int rows, int cols) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { cout << arr[i][j] << ' '; } cout << endl; } } int main() { srand(time(NULL)); int rows, cols; cout << "Enter rows count: " << endl; cin >> rows; cout << "Enter colums count: " << endl; cin >> cols; int** arr = new int*[rows]; for (int i = 0; i < rows; i++) { arr[i] = new int[cols]; } FillArray(arr, rows, cols); PrintArray(arr, rows, cols); // 释放内存 for (int i = 0; i < rows; i++) { delete[] arr[i]; } delete[] arr; return 0; }
关键修复点说明
- 修正参数类型:将
FillArray和PrintArray的第一个参数改为int** arr,与main中动态二维数组的类型匹配,此时arr[i][j]会正确解析为第i行第j列的元素。 - 修正传参方式:调用函数时直接传递
arr(int**类型),而非*arr,确保函数能访问整个二维数组。 - 规范main函数:将返回类型改为
int,并添加return 0;符合C++标准。 - 正确释放内存:使用
delete[] arr释放指针数组,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Bahodir
相关产品推荐
相关产品推荐

