不完整的arrays类型?

当我用gcc -Wall -pedantic -ansi -std=c89编译下面的代码时,它成功编译而没有在指针赋值时给出错误。 请注意,我将int (*)[4]int (*)[]

 int arr[4]; int (*p_arr)[] = &arr; 

假设有一些理由允许这个(不兼容的?)赋值,当我尝试使用它时,编译器会给出不完整的类型错误error: invalid application of 'sizeof' to incomplete type 'int[]'

 (void) sizeof(*p_arr); 

这个错误让我想到允许前一个指针赋值p_arr = &arr的用途是什么? 是否按照标准允许此分配?

我使用了不完整的struct / union类型(通常用于前向声明),并且还遇到了错误incomplete array element type 。 但这种incomplete array type对我来说是新的。 是否有可能在C标准中有一个用例?

此赋值没有给出任何错误,因为它们的类型是兼容的,因为未知边界的数组与兼容元素类型的任何数组兼容。 ( 供参考 ) –

 int (*p_arr)[] = &arr; 

但是将它作为操作数传递给sizeof运算符会出错,因为*p_arr是不完整类型的,并且您不应该使用不完整类型作为sizeof运算符的操作数。

N1570 6.5.3.4

1 sizeof运算符不应该应用于具有函数类型或不完整类型的表达式,这种类型的带括号的名称,或者应用于指定位字段成员的表达式[…]。

现在您可以使用它,这是一个简单的例子 –

 #include  int main(void){ int arr[4]={1,2,3,4}; int a[6]={1,2,3,3,1,1}; int (*p_arr)[] = &arr; for(int i=0;i<4;i++) printf("%d",(*p_arr)[i]); printf("\n"); p_arr=&a; for(int i=0;i<6;i++) printf("%d",(*p_arr)[i]); return 0; }