调用可变大小的数组作为参数

Calling array with variable size as parameter

我试图制作一个程序,用户可以在其中决定二维数组的维数。 编译时函数定义出错。为什么这是错误的,正确的方法是什么?

我正在使用 Dev-C++ 5.7.1 编译器(如果相关)。

#include<iostream>

using namespace std;

int R=0,C=0;                 

void func(int);

int main() {
    cin>>R>>C;
    int array[C][R];
                      // DO STUFF HERE
    func(array);
                      // DO SOME MORE STUFF
    return 0;
}

void func(int arr[][R]) {  
                     // DO STUFF HERE
}

我建议传入一个指向数组的指针,以及两个用于 R 和 C 的变量。然后由您来确保正确使用指针数学以保持在数组的范围内。 否则将其设置为模板,但您可能仍需要了解 R & C 的尺寸。

ISO-C++ 禁止 VLA。要动态分配数组,您需要使用一些原始指针技巧或使用 vector 向量。

向量方法的向量:

std::cin >> R >> C;
std::vector<std::vector<int>> array(R, std::vector<int>(C));

func 的签名变为(const 正确性可能不同)

void func(const std::vector<std::vector<int>>& v);

以上是更容易、更易于维护、更安全、更短的解决方案。


使用指针和指向指针的指针你可以做到,但它变得更复杂,你需要 deletenew

的一切
int R, C;
std::cin >> R >> C;
int **array = new int*[R]; // allocates space for R row pointers
for (int i = 0; i < R; ++i) {
    array[i] = new int[C]; // for each row, allocate C columns
}

func(R, C, array);

//then delete everything
for (int i = 0; i < R; ++i) {
    delete [] array[i]; // delete all of the ints themselves
}
delete [] array; // delete the row pointers.

func 的签名是

void func(int r, int c, int **arr);

同样,向量的向量对你来说会容易得多。

数组可以位于两个不同的内存区域 - 在堆栈上,或在堆上。
像您指定的数组位于堆栈上。

int array[SIZE];

当一个数组位于栈上时,编译器需要提前知道它的大小,因此SIZE必须是一个常量表达式(在编译时已知),有时是一个定义的值(使用#define设置)尺码 10).
如果你想创建一个未知大小的数组(将在运行时确定),你需要在堆上创建数组,如下所示:

int **array = new int*[C];
for(int i = 0;i<C; i++)
  array[i] = new int[R];

以后,你一定要记得删除你动态分配的所有东西(所有你用过的新东西)

for(int i = 0;i<C; i++)
  delete[] array[i];
delete[] array;

注意delete[]的使用,因为我们删除的是一个数组(array是一个整型数组的数组,array[i]是一个整型数组)