第一个来自C标准的引语是不正确的。它听起来像是:
- 函数定义中的调整参数类型不是完整的对象类型(6.9.1)
你遗漏了单词“完整”。
例如,在函数声明中,如果与其定义不处于同一类型,则可以指定不完整的对象类型,如下所示:
void f( size_t, size_t, int [][*] );
在这个函数声明中,第三个参数的声明不是一个完整的对象类型,因为数组元素的大小是未知的。
以下是一个演示程序。
#include <stdio.h>
void f( size_t, size_t, int [][*] );
void f( size_t m, size_t n, int a[][n] )
{
for ( size_t i = 0; i < m; i++ )
{
for ( size_t j = 0; j < n; j++ )
{
a[i][j] = n * i + j;
}
}
}
void g( size_t, size_t, int [][*] );
void g( size_t m, size_t n, int a[][n] )
{
for ( size_t i = 0; i < m; i++ )
{
for ( size_t j = 0; j < n; j++ )
{
printf( "%d ", a[i][j] );
}
putchar( '\n' );
}
}
int main(void)
{
size_t m = 2, n = 3;
int a[m][n];
f( m, n, a );
g( m, n, a );
return 0;
}
它的输出是
0 1 2
3 4 5
在程序中,这两个函数声明如下:
void f( size_t, size_t, int [][*] );
且
void g( size_t, size_t, int [][*] );
具有不完整对象类型的参数声明。
您可能无法使用这样的声明,因为它在同一时间同时充当定义,例如
void f( size_t m, size_t n, int a[][*] )
{
// ...
}
由于编译器无法确定在将第三个参数调整为指针后的指针类型,因此该指针将具有不完整的对象类型int(*)[]
。