传递动态大小的数组(不允许使用参数)

时间:2017-02-10 06:24:07

标签: c++ c arrays visual-studio

我有一个函数签名,它使用参数值来动态分配正确大小的数组

void print(int rows, int cols, char arr[rows][cols])

我目前在Visual Studio IDE中工作。它似乎有一个问题,不知道参数是什么,因此不知道要分配多少内存。这是一个语法错误,甚至无法编译。有没有办法忽略错误/编译器警告。我之前有一个scanf编译器警告但在此link之后禁用了它。我可以定义类似

的内容
    #define _CRT_SECURE_NO_DEPRECATE

这个问题?感谢

2 个答案:

答案 0 :(得分:2)

void print(int rows, int cols, char arr[rows][cols])

不是C ++中的有效声明。传递2D数组时,必须在编译时知道第二个维度cols的值。第一个维度的值可能是编译时间常数,或者只是它不能是rows

有效声明:

#define MAXCOLS 20
void print(int rows, int cols, char arr[][MAXCOLS])

#define MAXROWS 10
#define MAXCOLS 20
void print(int rows, int cols, char arr[MAXROWS][MAXCOLS])

#define MAXCOLS 20
void print(int rows, int cols, char (*arr)[MAXCOLS])

答案 1 :(得分:1)

至少在C ++中,您不能使用其他参数中指定的维度来声明数组参数,就像您正在尝试的那样。

一维固定数组(T[dim])可以衰变为指针(T*),因此可以执行以下操作:

void print(int rows, char *arr);

...

char arr[5];
print(5, arr);

但是,在传递多维数组时,必须明确指定除第一个维之外的所有维,例如:

void print(int rows, int cols, char (*arr)[10])

...

char arr[5][10];
print(5, 10, arr);

如果您不知道数组实际有多大,那么这对您的情况没有帮助(可能这就是为什么cols被传入的原因)。

但是,这可以使用模板来解决:

template<const int rows, const int cols>
void print(char arr[rows][cols])

...

char arr[5][10];
print<5, 10>(arr);