在 C++ 中动态创建二维数组时出现问题。这是代码。它不适用于某些特定条件
Posted
技术标签:
【中文标题】在 C++ 中动态创建二维数组时出现问题。这是代码。它不适用于某些特定条件【英文标题】:Problem while creating 2D array dynamically in C++. Here is the code. It dosen't work for some specific conditions 【发布时间】:2021-07-01 12:53:31 【问题描述】:在我的以下代码中,我从用户那里获取输入 (int) 行和列并创建一个二维数组。接受输入后,我正在打印相同的二维数组。
#include<iostream>
using namespace std;
int main()
int rows,cols;
cin>>rows>>cols;
int **matrix=new int*[cols];
for(int j=0;j<cols;j++)
matrix[j]=new int[rows] ;
for(int j=0;j<rows;j++)
for(int k=0;k<cols;k++)
cin>>matrix[j][k];
for(int j=0;j<rows;j++)
for(int k=0;k<cols;k++)
cout<<matrix[j][k]<<" ";
cout<<endl;
以上代码在2种情况下完美运行:
1st. when input rows and cols are equal.
2nd. when cols>rows.
It dosent work for the case in which rows>cols.
如果你不信任我,运行它并检查。我不知道我哪里错了。编译器也没有给出任何错误。请帮忙!!
【问题讨论】:
你在第一个循环之后交换列和行(考虑到第一个循环是正确的,我们无法猜测你的设计) 【参考方案1】:您忘记确定第一个下标是指行还是列,然后您在代码中途改变了主意。如果它是一个行优先数组,那么你分配它是错误的;如果它是主要的列,那么你填错了。
【讨论】:
【参考方案2】:您首先分配cols
,然后分配rows
。这意味着您的矩阵是“列专业”。但是在您的第二个和第三个循环中,您使用 row j
作为主索引,然后使用 column k
作为辅助索引。如果rows != cols
,您最终会离开数组之一的末端,调用未定义的行为。
因为您的矩阵是列主要的,您必须首先按列号索引,然后按行号。例如:
for(int j=0;j<cols;j++)
for(int k=0;k<rows;k++)
cin>>matrix[j][k];
【讨论】:
【参考方案3】:您错误地使用了rows
和cols
。在需要行的地方,有时会使用 cols,反之亦然。完整更正的代码:
Try it online!
#include<iostream>
using namespace std;
int main()
int rows,cols;
cin>>rows>>cols;
int **matrix=new int*[rows];
for(int j=0;j<rows;j++)
matrix[j]=new int[cols] ;
for(int j=0;j<rows;j++)
for(int k=0;k<cols;k++)
cin>>matrix[j][k];
for(int j=0;j<rows;j++)
for(int k=0;k<cols;k++)
cout<<matrix[j][k]<<" ";
cout<<endl;
输入:
3 2
1 2
3 4
5 6
输出:
1 2
3 4
5 6
【讨论】:
请注意,这会将内存布局更改为行优先。根据上下文和最常见的矩阵运算,列优先可能对缓存更友好。 (虽然 OP 在这种情况下可能不在乎。)以上是关于在 C++ 中动态创建二维数组时出现问题。这是代码。它不适用于某些特定条件的主要内容,如果未能解决你的问题,请参考以下文章
将 2d numpy 数组传递给 C++ 时出现 TypeError
将数组移交给 C# 中动态加载的 C++ DLL 时出现 System.AccessViolationException