[英]Function Prototypes with multi-dimensional arrays as a parameter
对C来说是全新的,我来自Java背景。
我遇到了无法编译的问题,因为编译器希望在编译时知道数组的大小。 例如,我想将阵列打印到控制台。 它不允许我这样声明函数原型:
void printRoom(char[][], int, int); //not allowed
我该怎么办呢? 有没有办法解决这个问题? 我发现的在线资源似乎表明,如果我想使用函数原型,我必须知道尺寸。 似乎还要求函数标头也具有数组的大小。
void printRoom(char room[][], int height, int width){ // not allowed, missing array bounds
解决这个问题的有效方法就是说数组的大小为1000 * 1000(我可以期望的最大数组大小)吗? 对我来说这似乎很草率,但是我很确定只要我不超出数组实际大小的范围,它就可以工作。
我目前对指针和malloc不感兴趣。
如果编译器支持可变长度数组,则可以通过以下方式声明该函数
void printRoom( int, int, char[*][*]);
要不就
void printRoom( int, int, char[][*]);
这是一个示范节目
#include <stdio.h>
#include <string.h>
void printRoom( int, int, char[*][*]);
void printRoom( int m, int n, char a[m][n] )
{
for ( int i = 0; i < m; i++ )
{
printf( "%3s ", a[i] );
putchar( ' ');
}
printf( "\n" );
}
int main(void)
{
const int M = 2;
const int N = 10;
char a[M][N];
strcpy( a[0], "Hello" ),
strcpy( a[1], "World" );
printRoom( M, N, a );
return 0;
}
它的输出是
Hello World
如果编译器不支持VLA,则列数必须为常数。 例如
#define N 100
//...
void printRoom(char[][N], int, int);
C标准在§6.7.6.3中声明了函数声明符(包括原型) :
¶12如果函数声明符不是该函数定义的一部分,则参数可能具有不完整的类型,并可能在其声明符说明符序列中使用
[*]
表示法来指定可变长度数组类型。
这是标准的说法: 您可以使用以下符号来编写函数声明,但不能编写函数定义:
其中的参数在声明中重新排序,因为在函数定义中,必须在指定数组之前指定大小:
void printRoom(int height, int width, char room[height][width])
{
…
}
您可以在函数中颠倒height
和width
的顺序,但是通常在C语言中,您会按照尺寸的使用顺序来命名尺寸。 您不必指定领先尺寸的大小; 所有其他必须具有与之关联的大小。 这意味着您可以编写:
void printRoom(int, int, char [][*]);
和:
void printRoom(int height, int width, char room[][width])
{
…
}
该函数仍然需要知道高度,以便它可以准确地处理数组,但是不必一定是数组定义的一部分。
§6.9.1 函数定义
¶10在进入函数时,将评估每个可变修改参数的大小表达式,并将每个参数表达式的值转换为相应参数的类型,就像通过赋值一样。 (在调用之前,将数组表达式和函数指定符作为参数转换为指针。)
您的room
是一个可变修改的参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.