在c ++中使用动态多维数组

Using dynamic multi-dimensional arrays in c++

我正在制作一个C++程序,检查给定的ARAY是否是拉丁方。我需要使用一个动态多维数组来存储给定的拉丁方。但我不能将数组传递给执行检查的函数…

目前我有这样的代码来调用函数:

1
2
3
4
int squaretest(int **p, int n, int sum) {

    //some code
};

此代码用于创建数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
int main() {

    //some code. n - length of one row, sum - sum of elements in one row.
    int a;  
    int **lsquare;
    lsquare = new int*[n];
    for (int i=0;i<=n-1;i++) for (int j=0;j<=n-1;j++) {
        cin >>a;
        lsquare[i][j] = a;
    }
    blocktest(lsquare,n,sum);
    //some code
};

代码编译(我使用的是geany ide和g++编译器),但是当我在终端中运行它时,在第一次输入之后,它必须存储在块[0][0]中,我会得到分段错误。我的代码有什么问题,正确的解决方法是什么?


为了能够做到这一点……您实际上需要这样做:

1
2
3
4
5
6
7
8
9
10
int **lsquare = new int*[n];

for (int i=0; i<n; ++i)
    lquare[i] = new int[n];

for (int i=0; i<n; i++)
    for (int j=0; j<n; j++)
        cin >> lsquare[i][j];

blocktest(lsquare,n,sum);

更好的方法是:

1
2
3
4
5
6
7
int *lsquare = new int[n*n];

for (int i=0; i<n; ++i)
    for (int j=0; j<n; ++j)
        cin >> lsquare[i + j*n];

blocktest(lsquare, n, sum);

你忘了为矩阵的第二维度分配内存。

1
2
3
4
5
int **lsquare;
lsquare = new int*[n];
for (int i=0; i<n; ++i){
  lsquare[i] = new int[n];
....}

没有人写

1
for (int i=0;i<=n-1;i++){...}

代替做

1
for (int i=0; i<n; ++i){...}


您还必须为第二个维度分配空间,请在分配lsquare之后添加:

1
2
3
4
for(int i = 0; i < n; ++i)
{
    lsquare[i] = new int[n];
}

你给自己做了一个指针指针,它可以作为一个矩阵使用,为它分配了一行,然后开始像你分配了一个完整的n*n矩阵一样操作。如果你运行它,你确实会得到一个segfault。

您需要为n*n元素分配足够的空间,而不仅仅是其中n个元素。

使用STD::向量的STD::向量的一个更容易出错的解决方案。


您实际创建的是一个数组数组。不仅需要使用new来分配数组,还必须分配所有n数组。您需要让嵌套for循环的外部循环分配n个子数组中的每个。

2


在lsquare中有一个指针数组。

你可能只想做如下的事情:

1
lsquare = new int[n * n];

这样你就可以填写这个正方形,但是类型是:

1
int *lsquare