不完整的阵列类型?

时间:2015-11-18 10:06:23

标签: c arrays pointers gcc language-lawyer

当我使用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标准中使用?

1 个答案:

答案 0 :(得分:6)

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

int (*p_arr)[] = &arr;

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

N1570 6.5.3.4

  

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

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

#include <stdio.h>

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;
}