我还没有定义 struct a
,但是我可以使用 struct a
声明变量。下面的代码可以在 Linux 上用 GCC 编译,那么 struct a
的成员是什么? a
是否仅被识别为 char *
?不知道什么意思。
void main() {
struct a *a1;
a1 = 0;
}
最佳答案
struct a *a1;
将a1
声明为指向struct a
的指针。您可以合法地声明一个指针
转换为不完整的 struct
类型 a
,因为编译器不需要知道
定义struct a
来创建一个指向它的指针。所有指向struct
的指针
类型具有相同的内存表示和对齐要求,那就是
编译器需要知道创建一个的所有信息。您的任务:
a1 = 0;
只需将指针设置为0,即使其成为空指针。它假设什么都没有 关于指针可能指向的对象的类型。如果你要 尝试类似的事情:
a1->member = 0;
这需要编译器有struct a
的定义,而你
会看到编译失败,例如:
main.c:3:7: error: dereferencing pointer to incomplete type ‘struct a’
a1->member = 0;
^
稍后
Where do I need use this syntax? Usually what does undefined struct be used for?
不完整的struct
指针的经典用途是实现抽象数据类型
在 C 中。通过头文件公开的 C API 是根据“不透明”struct
指针定义的
- 指向不完整类型的指针 - 以便客户端可以查询
并只能通过 API 来操作这些指针寻址的对象,而不能
绕过它以未经批准的方式处理物体,因为他们看不到
不透明指针指向的数据类型的定义!这是 elementary example
from the C FAQ
关于gcc - 未定义的结构名称可用于声明新的结构变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51037904/