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标准中使用并具有用例?
此赋值没有给出任何错误,因为它们的类型是兼容的,因为未知边界的数组与兼容元素类型的任何数组兼容.(供参考) -
int (*p_arr)[] = &arr;
Run Code Online (Sandbox Code Playgroud)
但是将它作为操作数传递给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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1034 次 |
| 最近记录: |