调用可变大小的数组作为参数
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);
以上是更容易、更易于维护、更安全、更短的解决方案。
使用指针和指向指针的指针你可以做到,但它变得更复杂,你需要 delete
你 new
的一切
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]是一个整型数组)
我试图制作一个程序,用户可以在其中决定二维数组的维数。 编译时函数定义出错。为什么这是错误的,正确的方法是什么?
我正在使用 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);
以上是更容易、更易于维护、更安全、更短的解决方案。
使用指针和指向指针的指针你可以做到,但它变得更复杂,你需要 delete
你 new
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]是一个整型数组)