小编Yan*_*hen的帖子

为什么sys/queue.h中的双向链表保持前一个下一个元素的地址?

我正在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),而不是简单地以前elmentstruct type *le_prev

c queue bsd struct doubly-linked-list

8
推荐指数
1
解决办法
1282
查看次数

灵活阵列成员的真正好处是什么?

在阅读了一些与柔性阵列成员相关的帖子后,我仍然不完全理解为什么我们需要这样的功能.

可能重复:
C中的灵活数组成员 - 不好?
这是C中的Flexible Array Struct成员吗?

(如果我没有从上面可能的重复问题中解决我的问题,请怪我)

以下两个实现之间的真正区别是什么:

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)不包含实际大小的数据?我相信我必须错过这个功能的一些更重要的观点.请指出给我.

c struct flexible-array-member

7
推荐指数
2
解决办法
980
查看次数