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

C++二维数组报错:invalid types 'int[int]' for array subscripts 求助

问题分析与解决方案

错误原因

  1. 参数类型不匹配:
    • getValues函数的第一个参数声明为int &nums,但实际需要操作的是二维数组,而传入的nums[r][c]只是数组中一个int类型的元素,函数内部试图用nums[i][j]访问数组,类型完全不匹配,直接触发报错。
  2. 行列数传递方式错误:
    • r和c在getValues中是值传递,函数内修改的只是局部变量,main函数里的r和c不会同步更新,后续操作数组时必然出现越界或逻辑错误。
  3. 非标准变长数组(VLA):
    • int nums[r][c];是C语言的变长数组特性,C++标准并未定义该语法,不同编译器支持情况不一,属于非标准写法,存在兼容性问题。

修正步骤

  1. 调整函数参数:将getValues的参数改为能接收二维动态数组的指针,同时把r和c改为引用传递,确保函数内修改的行列数能同步到main函数。
  2. 替换动态分配数组:放弃非标准VLA,改用动态内存分配创建二维数组,保证代码符合C++标准。
  3. 修正函数调用逻辑:传入正确的数组指针和行列数引用,而非单个数组元素。
  4. 添加内存释放逻辑:动态分配的数组需要手动释放,避免内存泄漏。

修正后的代码(动态数组版)

#include <iostream>

using namespace std;

// 获取用户输入并填充二维数组
void getValues(int **&nums, int &r, int &c)
{
    // 获取行列数
    cout << "输入行数: ";
    cin >> r;
    cout << "输入列数: ";
    cin >> c;

    // 动态分配二维数组
    nums = new int*[r];
    for (int i = 0; i < r; i++)
    {
        nums[i] = new int[c];
    }

    // 填充数组元素
    for (int i = 0; i < r; i++)
    {
        for (int j = 0; j < c; j++)
        {
            cout << "输入数组元素 [" << i << "][" << j << "]: ";
            cin >> nums[i][j];
        }
    }
}

// 显示二维数组内容
void display(int **nums, int r, int c)
{
    cout << "二维数组内容:" << endl;
    for (int i = 0; i < r; i++)
    {
        for (int j = 0; j < c; j++)
        {
            cout << nums[i][j] << " ";
        }
        cout << endl;
    }
}

// 释放动态分配的数组内存
void freeArray(int **nums, int r)
{
    for (int i = 0; i < r; i++)
    {
        delete[] nums[i];
    }
    delete[] nums;
}

int main()
{
    int r = 0;
    int c = 0;
    int user;
    int **nums = nullptr; // 二维动态数组指针

    cout << "1. 输入数组值" << endl;
    cout << "2. 显示数组值" << endl;
    cout << "3. 计算所有元素总和" << endl;
    cout << "4. 计算行总和" << endl;
    cout << "5. 计算列总和" << endl;
    cout << "6. 转置数组" << endl;
    cout << "7. 退出" << endl;
    cout << "选择操作(输入选项编号): ";
    cin >> user;

    switch (user)
    {
        case 1:
            getValues(nums, r, c);
            break;
        case 2:
            if (nums != nullptr)
                display(nums, r, c);
            else
                cout << "请先输入数组值!" << endl;
            break;
        case 7:
            if (nums != nullptr)
                freeArray(nums, r);
            return 0;
        default:
            cout << "无效选项!" << endl;
    }

    // 程序退出前释放内存
    if (nums != nullptr)
        freeArray(nums, r);
    return 0;
}

更简洁的C++容器版(推荐)

如果不想手动管理内存,可以用vector<vector<int>>替代动态数组,代码更简洁且符合C++现代风格:

#include <iostream>
#include <vector>

using namespace std;

void getValues(vector<vector<int>> &nums, int &r, int &c)
{
    cout << "输入行数: ";
    cin >> r;
    cout << "输入列数: ";
    cin >> c;

    nums.resize(r, vector<int>(c));
    for (int i = 0; i < r; i++)
    {
        for (int j = 0; j < c; j++)
        {
            cout << "输入数组元素 [" << i << "][" << j << "]: ";
            cin >> nums[i][j];
        }
    }
}

void display(const vector<vector<int>> &nums)
{
    cout << "二维数组内容:" << endl;
    for (const auto &row : nums)
    {
        for (int num : row)
        {
            cout << num << " ";
        }
        cout << endl;
    }
}

int main()
{
    int r = 0, c = 0;
    int user;
    vector<vector<int>> nums;

    cout << "1. 输入数组值" << endl;
    cout << "2. 显示数组值" << endl;
    cout << "3. 计算所有元素总和" << endl;
    cout << "4. 计算行总和" << endl;
    cout << "5. 计算列总和" << endl;
    cout << "6. 转置数组" << endl;
    cout << "7. 退出" << endl;
    cout << "选择操作(输入选项编号): ";
    cin >> user;

    switch (user)
    {
        case 1:
            getValues(nums, r, c);
            break;
        case 2:
            if (!nums.empty())
                display(nums);
            else
                cout << "请先输入数组值!" << endl;
            break;
        case 7:
            return 0;
        default:
            cout << "无效选项!" << endl;
    }

    return 0;
}

内容的提问来源于stack exchange,提问作者jonluca29

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:35:29