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::向量的一个更容易出错的解决方案。
您实际创建的是一个数组数组。不仅需要使用
在lsquare中有一个指针数组。
你可能只想做如下的事情:
1 | lsquare = new int[n * n]; |
这样你就可以填写这个正方形,但是类型是:
1 | int *lsquare |