我有一个函数签名,它使用参数值来动态分配正确大小的数组
void print(int rows, int cols, char arr[rows][cols])
我目前在Visual Studio IDE中工作。它似乎有一个问题,不知道参数是什么,因此不知道要分配多少内存。这是一个语法错误,甚至无法编译。有没有办法忽略错误/编译器警告。我之前有一个scanf编译器警告但在此link之后禁用了它。我可以定义类似
的内容 #define _CRT_SECURE_NO_DEPRECATE
这个问题?感谢
答案 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);