当我使用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标准中使用?
答案 0 :(得分:6)
此赋值没有给出任何错误,因为它们的类型是兼容的,因为未知边界的数组与兼容元素类型的任何数组兼容。(For reference) -
int (*p_arr)[] = &arr;
但是在将它作为操作数传递给sizeof
运算符时会出错,因为*p_arr
的类型不完整,并且您不应该使用不完整类型作为sizeof
运算符的操作数。
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;
}