如果行和列的差大于 1,为啥我不能打印二维数组?

Posted

技术标签:

【中文标题】如果行和列的差大于 1,为啥我不能打印二维数组?【英文标题】:Why can't I print a 2d array if the rows and columns have a difference greater than 1?如果行和列的差大于 1,为什么我不能打印二维数组? 【发布时间】:2021-09-10 07:40:47 【问题描述】:

我创建了一个程序,该程序接受用户输入他们想要在二维数组中生成的行数和列数。然后程序获取该数组并仅反转行的顺序。一切似乎都很好,但是当我输入行数和列数时,如果这两个整数之间的差大于 1,代码就会中断。我是 C++ 的初学者,所以我不完全确定这里发生了什么。任何帮助表示赞赏!

#include <stdio.h>
#include <iostream>
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";

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[i][j] = r;
        cout << matr[i][j] << " ";
    

cout << "\n\n";

int **ptr = &matr[rows*cols];

for (int j = rows-1; j > -1; j--)

    cout << "\n";
    for (int i = 0; i < cols; i++)
    
        *ptr = &matr[i][j];
        cout << **ptr << " ";
    

cout << "\n";

调试时,Visual Studio 向我显示一条错误消息,显示“读取访问冲突”。我不知道它在这里试图告诉我什么,但我认为问题在于该错误。

【问题讨论】:

你交换了rowscols。第一个维度应该迭代到rows,第二个维度应该迭代到cols 您有时在索引时混淆了行/列。当j 用于rowsi 用于cols 时,matr[i][j] 应为matr[j][i] 【参考方案1】:

此声明

int **ptr = &matr[rows*cols];

没有意义。表达式&amp;matr[rows*cols] 指向只有rows 元素的数组matr 之外。

如果你想尊重数组matr中行的顺序,那么你可以写

for ( int **first = matr, **last = matr + rows; first < --last; ++first )

    std::swap( *first, *last );

然后您可以使用索引将数组 matr 输出为二维数组。

【讨论】:

以上是关于如果行和列的差大于 1,为啥我不能打印二维数组?的主要内容,如果未能解决你的问题,请参考以下文章

寻找二维数组中唯一的行和列的索引,以及这些位置上元素的最小和。

打印 2 个数组的行和列的总和

数据结构与算法 - 数组

C语言数组为啥按行优先存储

为啥代码不能打印这个二维数组的元素?

c语言:将一个二维数组行和列的元素互换,存到另一个二维数组中。