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

C++中for循环无法正确存储二维数组值的问题求助

问题分析与解决思路:二维数组无法正确存储值的原因

嘿,我一眼就看到问题出在哪了——你这数组声明的时机完全搞反了,而且还踩了C++里几个常见的坑,我给你拆解下:

核心问题点

  • 全局变量初始化陷阱:你把row和col声明成了全局变量,C++里全局变量默认会被初始化为0。而你在main函数里先声明了int val[row][col];,这时候row和col都是0,相当于创建了一个0行0列的空数组!等你后面输入真正的行列数再往这个数组里写值,完全是在越界访问内存,这属于未定义行为,数据自然存不住,甚至可能导致程序崩溃。
  • 非标准的变长数组:另外,C++标准本身并不支持用变量作为数组大小来声明数组(也就是你写的int val[row][col];这种变长数组),虽然部分编译器比如GCC会把它作为扩展特性支持,但这不是标准写法,可移植性很差,不建议这么用。

两种靠谱的解决方法

方法1:用动态分配(原生数组方式)

先获取用户输入的行列数,再用new动态创建二维数组,记得用完要释放内存避免泄漏:

#include <iostream>
using namespace std;

int main() {
    int row, col;
    cout << "How many rows are there?" << endl;
    cin >> row;
    cout << "How many columns are there?" << endl;
    cin >> col;

    // 先分配行指针数组
    int** val = new int*[row];
    // 再为每一行分配列空间
    for (int i = 0; i < row; i++) {
        val[i] = new int[col];
    }

    cout << "Enter values for the matrix: " << endl;
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            cin >> val[i][j];
        }
    }

    // 打印检查
    cout << "Your matrix:" << endl;
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            cout << val[i][j] << " ";
        }
        cout << endl;
    }

    // 必须释放内存,先释放每一行,再释放行指针数组
    for (int i = 0; i < row; i++) {
        delete[] val[i];
    }
    delete[] val;

    return 0;
}

方法2:用标准库vector(推荐!更安全省心)

现代C++推荐用vector容器来代替原生数组,它会自动管理内存,不用手动释放,写法也更简洁:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int row, col;
    cout << "How many rows are there?" << endl;
    cin >> row;
    cout << "How many columns are there?" << endl;
    cin >> col;

    // 直接创建row行col列的二维vector,默认初始化为0
    vector<vector<int>> val(row, vector<int>(col));

    cout << "Enter values for the matrix: " << endl;
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            cin >> val[i][j];
        }
    }

    // 打印检查,用范围for循环更优雅
    cout << "Your matrix:" << endl;
    for (const auto& current_row : val) {
        for (int num : current_row) {
            cout << num << " ";
        }
        cout << endl;
    }

    return 0;
}

总结一下

你之前的代码本质是在数组大小还没确定的时候就创建了数组,导致后续的写入操作全是非法内存访问。优先选vector方案,它不仅解决了你的问题,还避免了手动管理内存的麻烦;如果一定要用原生数组,记得先获取行列数再动态分配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:32:43