不完整的阵列类型?

use*_*104 12 c arrays gcc pointers language-lawyer

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

int arr[4];
int (*p_arr)[] = &arr;
Run Code Online (Sandbox Code Playgroud)

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

(void) sizeof(*p_arr);
Run Code Online (Sandbox Code Playgroud)

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

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

ame*_*yCU 6

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

int (*p_arr)[] = &arr;
Run Code Online (Sandbox Code Playgroud)

但是将它作为操作数传递给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;
}
Run Code Online (Sandbox Code Playgroud)

  • @ user1969104请不要通过编辑突然改变问题.如果您有新问题,请发布新问题.事实证明,你的第二个问题与C和C++之间的指针转换规则的差异有关,这甚至与指向不完整类型的指针无关.考虑C和C++中的例子`intptr = voidptr;`,你会遇到同样的问题. (2认同)