我没有定义结构a
,但是我可以使用结构a
声明变量。以下代码可以由GCC在Linux上编译,因此,结构a
的成员是什么? a
仅被识别为char *
吗?我不知道这是什么意思。
void main() {
struct a *a1;
a1 = 0;
}
答案 0 :(得分:2)
struct a *a1;
将a1
声明为struct a
的指针。您可以合法地声明一个指针
到不完整的struct
类型a
,因为编译器不需要知道
struct a
的定义以为其创建 pointer 。所有指向struct
的指针
类型具有相同的内存表示和对齐要求,那就是
创建一个编译器所需的所有知识。您的作业:
a1 = 0;
只需将 pointer 设置为0,即使其成为空指针。它假定什么都没有 关于指针可能指向的对象的类型。相反,如果您要 尝试类似的东西:
a1->member = 0;
那将要求编译器具有struct a
的定义,而您
会看到类似的编译失败:
main.c:3:7: error: dereferencing pointer to incomplete type ‘struct a’
a1->member = 0;
^
稍后
我在哪里需要使用此语法?通常,未定义的结构用于什么?
不完整struct
指针的经典用法是实现抽象数据类型
通过头文件公开的C API是根据“不透明” struct
指针定义的
-指向不完整类型的指针-以便客户端可以查询
只能通过API来操作和处理这些指针寻址的对象,而不能
规避它以未经批准的方式处理对象,因为它们看不到
不透明指针指向的数据类型的定义!这是一个elementary example
from the C FAQ