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

C++二维数组行列差值大于1时报错无法打印,该如何排查解决?

问题排查与修复说明

错误原因梳理

  • 二维数组访问下标颠倒,触发越界
    你声明的matr是rows行cols列的动态二维数组,访问规则为matr[行下标][列下标],行下标合法范围是0~rows-1,列下标合法范围是0~cols-1。你在赋值循环中将行列下标写反,用遍历列范围的i作为行下标,遍历行范围的j作为列下标,当行数和列数差值大于1时,很容易出现行下标超过rows-1的情况,直接访问非法内存。
  • 野指针操作触发访问违例
    代码中int **ptr = &matr[rows*cols];是完全非法的:matr仅存储了rows个行指针,合法下标最大为rows-1,访问rows*cols位置已经是不属于你程序的野地址,后续对*ptr赋值、**ptr解引用都是操作非法内存,这就是VS报read access violation的直接原因,该报错的含义就是程序尝试读取了没有访问权限的内存地址。
  • 行反转逻辑错误
    你要实现行顺序反转,只需要倒序遍历行下标即可,不需要额外定义指针做冗余操作。

修正后的代码

#include <stdio.h>
#include <iostream>
#include <time.h>
using namespace std;

int main() 
{
    int r;
    int rows;
    int cols;

    cout << "how many rows: ";
    cin >> rows;
    cout << "\n";
    cout << "how many columns: ";
    cin >> cols;
    cout << "\n";

    // 初始化随机数种子,否则每次运行生成的随机数都相同
    srand((unsigned int)time(NULL));

    int** matr = new int* [rows];
    for (int i = 0; i < rows; i++)
    {
        matr[i] = new int[cols];
    }

    // 赋值修正,行下标用遍历行数的变量,列下标用遍历列数的变量
    for (int j = 0; j < rows; j++)
    {
        cout << "\n";
        for (int i = 0; i < cols; i++)
        {
            r = rand() % 50 - rand() % 50;
            matr[j][i] = r;
            cout << matr[j][i] << " ";
        }
    }
    cout << "\n\n反转行顺序后:\n";

    // 行反转逻辑,直接倒序输出每行即可
    for (int j = rows-1; j >= 0; j--)
    {
        cout << "\n";
        for (int i = 0; i < cols; i++)
        {
            cout << matr[j][i] << " ";
        }
    }
    cout << "\n";

    // 补充:释放动态申请的内存,避免内存泄漏
    for (int i = 0; i < rows; i++)
    {
        delete[] matr[i];
    }
    delete[] matr;

    return 0;
}

补充注意事项

动态申请的数组使用完后需要手动释放,否则会出现内存泄漏;如果需要每次运行生成不同的随机数,需要调用srand设置随机数种子。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:15:04