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

标签 c struct flexible-array-member

看了一些关于flexible array member的帖子,我还是不太明白为什么我们需要这样一个特性。

Possible Duplicate:
Flexible array members in C - bad?
Is this a Flexible Array Struct Members in C as well?

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

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

struct h1 {
    size_t len;
    unsigned char *data;
};

struct h2 {
    size_t len;
    unsigned char data[];
};

我知道 h2 的大小就像省略了灵活的数组成员(数据)一样,即 sizeof(h2) == sizeof(size_t)。而且我也知道灵活的数组成员只能作为一个结构体的最后一个元素出现,所以原来的实现在data的位置可以更加灵活。

我真正的问题是,为什么 C99 添加此功能?仅仅因为 sizeof(h2) 不包含数据的真实大小?我确信我一定错过了这个功能的一些更重要的要点。请为我指出。

最佳答案

您帖子中的两个结构根本没有相同的结构。 h1 有一个整数和一个指向 char 的指针。 h2 有一个整数和一个字符数组内联(元素数量在运行时确定,可能没有)。

换句话说,在h2 中,字符数据位于结构内部。在 h1 中,它必须在外面的某个地方。

这有很大的不同。例如,如果您使用 h1,您需要注意分配/释放负载(除了结构本身)。使用h2,只需要一次分配/释放,一切都打包在一起。

使用 h2 可能有意义的一种情况是,如果您正在与需要 {length,data} 对形式的消息的对象通信。您通过请求 sizeof(h2)+您想要的有效负载字符数 来分配 h2 的实例,将其填满,然后您可以在一个 write (当然要注意字节顺序等)。如果您使用了 h1,则需要两次 write 调用(除非您想发送数据的内存地址,这通常没有任何意义)。

所以这个功能存在是因为它很方便。以及之前使用的各种(有时是不可移植的)技巧来模拟此功能。将其添加到标准中是有意义的。

关于c - 灵活阵列成员的真正好处是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20310207/

相关文章:

c - 如何正确声明此功能?

c - C中的指针问题

c - 结构之前的预期表达式错误

c - 如何正确使用灵活数组成员?

c - 使用 strstr 确定给定字符串是否包含带空格的字符串 [C]

c# - C#、C 和 OCaml 中的模运算

创建的文件中没有任何内容

c++ - 使用模板和基类实现灵活的数组成员

c - 错误: Invalid use of flexible array member

c - 如何将一个句子复制到一个字符数组中