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

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 的金徽章,我敢肯定这只是一个诚实的错误。

以上是关于传递动态大小的数组(不允许使用参数)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在方法中传递数组并获取它的大小[重复]

将数组常量传递给枚举构造函数[重复]

将表名作为输入参数动态传递并使用它[重复]

在函数c ++中将变量作为默认参数传递[重复]

无法使用双指针作为函数参数传递二维数组[重复]

将函数作为参数传递。 C++