我正在sys/queue.h从FreeBSD 学习,我有一个问题:
In sys/queue.h,LIST_ENTRY定义如下:
#define LIST_ENTRY(type) \
struct { \
struct type *le_next; /* next element */ \
struct type **le_prev; /* address of previous next element */ \
}
Run Code Online (Sandbox Code Playgroud)
为什么会维持之前的下一个元素的地址(struct type **le_prev),而不是简单地以前elment样struct type *le_prev?
在阅读了一些与柔性阵列成员相关的帖子后,我仍然不完全理解为什么我们需要这样的功能.
(如果我没有从上面可能的重复问题中解决我的问题,请怪我)
以下两个实现之间的真正区别是什么:
struct h1 {
size_t len;
unsigned char *data;
};
struct h2 {
size_t len;
unsigned char data[];
};
Run Code Online (Sandbox Code Playgroud)
我知道h2的大小就好像省略了灵活的数组成员(数据),即sizeof(h2) == sizeof(size_t).而且我也知道灵活的数组成员只能作为结构的最后一个元素出现,因此原始实现在位置上可以更灵活data.
我真正的问题是为什么C99添加此功能?仅仅因为sizeof(h2)不包含实际大小的数据?我相信我必须错过这个功能的一些更重要的观点.请指出给我.