You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++二维动态数组随机赋值函数报错求助:arr[i][j]索引异常

C++二维数组操作隐性错误分析与修复

核心问题

你的代码存在多个关键问题,直接导致第12行和第22行的索引操作出现未定义行为:

  1. 函数参数类型不匹配:FillArray和PrintArray的参数定义为int arr[],实际会退化为int*类型,但你在main中创建的是int**类型的动态二维数组。用一维指针执行二维索引(arr[i][j])会破坏内存结构,引发隐性错误。
  2. 函数调用传参错误:调用FillArray(*arr, rows, cols)时,*arr仅指向二维数组的第一行(int*类型),无法代表整个二维数组,导致后续行的访问完全越界。
  3. main函数返回类型违规:C++标准要求main函数的返回类型必须是int,而非void,这会导致编译错误。
  4. 内存释放不规范:释放指针数组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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 00:06:11