【发布时间】:2018-06-26 08:07:06
【问题描述】:
我还没有定义结构a,但是我可以用结构a 声明变量。以下代码可以通过 GCC 在 Linux 上编译,那么 struct a 的成员是什么? a 是否被识别为 char * ?不知道是什么意思。
void main() {
struct a *a1;
a1 = 0;
}
【问题讨论】:
我还没有定义结构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;
只需将 pointer 设置为 0,即使其成为空指针。它假设什么 关于指针可能指向的对象类型。相反,如果你要 尝试类似:
a1->member = 0;
那 将要求编译器具有struct a 的定义,而您
会看到如下编译失败:
main.c:3:7: error: dereferencing pointer to incomplete type ‘struct a’
a1->member = 0;
^
稍后
我在哪里需要使用这种语法?通常 undefined struct 是做什么用的?
不完整struct指针的经典用法是实现抽象数据类型
在 C 中。通过头文件公开的 C API 是根据“不透明”struct 指针定义的
- 指向不完整类型的指针 - 以便客户端可以查询
并仅通过 API 操作由这些指针寻址的对象,而不能
绕过它以未经批准的方式处理对象,因为他们看不到
不透明指针指向的数据类型的定义!这是elementary example
from the C FAQ
【讨论】: