传递动态大小的数组(不允许使用参数)[重复]
Posted
技术标签:
【中文标题】传递动态大小的数组(不允许使用参数)[重复]【英文标题】:Passing Dynamically Sized Arrays (a parameter is not allowed) [duplicate] 【发布时间】:2017-06-28 09:54:38 【问题描述】:我有一个函数签名,它使用参数值动态分配正确大小的数组
void print(int rows, int cols, char arr[rows][cols])
我目前在 Visual Studio IDE 中工作。不知道参数是什么,因此不知道要分配多少内存似乎存在问题。这是一个语法错误,甚至无法编译。有没有办法忽略错误/编译器警告。我之前有一个 scanf 编译器警告,但在此 link 之后禁用了它。我可以定义类似的东西
#define _CRT_SECURE_NO_DEPRECATE
这个问题?谢谢
【问题讨论】:
只显示编译器输出以获得更好的描述 您是在编程 C 还是 C++?这确实会产生很大 的不同,因为您为函数声明显示的内容在一种语言中是允许的,而在另一种语言中则不允许。不要添加无关的语言标签。 这看起来不像是有效的 C++。我认为第三个参数必须是char **arr
?无论如何,就像@andrgolubev 已经说过的那样:编译器输出是什么?
【参考方案1】:
void print(int rows, int cols, char arr[rows][cols])
不是 C++ 中的有效声明。传递二维数组时,第二维的值,在您的情况下为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])
【讨论】:
【参考方案2】:至少在 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);
【讨论】:
这是一个非常糟糕且不正确的解决方案。指向指针的指针不 等效于数组数组。但是,数组数组等效于指向数组的指针,因此对于char[5][10]
,其等效类型为char (*)[10]
。此外,OP is 显示的声明在 C 中有效,它允许可变长度数组。而且我们仍然不知道 OP 是用 C 还是 C++ 编程的。
@Someprogrammerdude 用户有 c 的金徽章,我敢肯定这只是一个诚实的错误。以上是关于传递动态大小的数组(不允许使用参数)[重复]的主要内容,如果未能解决你的问题,请参考以下文章