繁体   English   中英

以多维数组为参数的函数原型

[英]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])
{
    …
}

您可以在函数中颠倒heightwidth的顺序,但是通常在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM