为什么以下程序无法运行?
void test(int*[]);
int main()
{
char *a[2];
test((int*[])a);
return 0;
}
void test(int* c[]){
}
它显示
错误转换为不完整类型 'int*[]' test((int*[])a)
问题可以通过使用来解决:
test((int**)a);
但是前面的代码有什么问题吗?
编辑:在函数原型声明中,括号内使用与强制转换相同的内容。
(整数*[])
那么为什么这不是一个不完整的类型呢?
问题是
int *[]
是一个不完整的类型,无法实例化。
在函数声明中,
int *[]
与 int **
完全相同,因为在任何情况下传递给函数的实际参数都将是“指向 int 指针的指针”。因此,在函数声明的上下文中,int *[]
实际上指的是完整类型(指向int的指针)。
然而,在转换中,
(int *[])a
告诉编译器创建类型为int *[]
的临时类型,但这是不允许的,因为它是不完整的类型。
虽然我们不能拥有不完整类型的值,但我们可以拥有指向此类值的指针,因此可以编译以下代码(只是为了示例;这不是推荐的构造) - 使用 typedef 以获得更清晰的表示法:
typedef int * incompleteIntArray[];
void test(int*[]);
int main()
{
char *a[2];
test(*(incompleteIntArray *)&a);
}
这里的要点是,虽然
incompleteIntArray
(又名 int *[]
)是不完整类型,但指向该类型的指针却不是。因此,指向 &a
的指针 char *[2]
可以转换为指向 int *[]
的指针,我们可以取消引用它来创建函数参数。但是,这只有效,因为数组始终通过引用传递,因此实际参数是指针,而不是 int *[]
的实例。