未定义的结构名称可用于声明新的结构变量

Undefined struct name can be used to declare new struct variable

我没有定义结构 a,但是我可以用结构 a 声明变量。 GCC 可以在 Linux 上编译以下代码,那么,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;

that 将要求编译器定义 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 是根据 "opaque" struct 指针定义的 - 指向不完整类型的指针 - 以便客户端可以查询 并且只能通过 API 操作这些指针寻址的对象,不能 绕过它以未经批准的方式处理对象,因为他们看不到 不透明指针指向的数据类型的定义!这是一个 基本示例 来自 C 常见问题