在 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&gt;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】:

您错误地使用了rowscols。在需要行的地方,有时会使用 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

二维数组C++的动态分配

如何在 C++ 中初始化指向动态二维数组的指针 [关闭]

Swift:填充二维数组时出现索引超出范围错误