8

在阅读了一些与灵活数组成员相关的帖子后,我仍然不完全理解为什么我们需要这样的功能。

可能重复:
C 中的灵活数组成员 - 不好?
这也是 C 中的灵活数组结构成员吗?

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

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

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

4

3 回答 3

10

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

换句话说,在h2字符数据是在结构里面。h1它必须在外面的某个地方。

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

h2使用可能有意义的一种情况是,如果您正在与期望{length,data}成对形式的消息的事物进行通信。h2您通过请求分配一个实例sizeof(h2)+how many payload chars you want,填充它,然后您可以将整个事情转移到一个单一的write(当然要注意字节序等)。如果您使用过h1,则需要两次write调用(除非您想发送数据的内存地址,这通常没有任何意义)。

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

于 2013-12-01T08:37:36.380 回答
7
于 2013-12-01T08:39:51.343 回答
2

I don't know if this is considered as an important point, but GCC docs points this out:

GCC allows static initialization of flexible array members. This is equivalent to defining a new structure containing the original structure followed by an array of sufficient size to contain the data. E.g. in the following, f1 is constructed as if it were declared like f2.

struct f1 {
    int x; int y[];
} f1 = { 1, { 2, 3, 4 } };

struct f2 {
    struct f1 f1; int data[3];
} f2 = { { 1 }, { 2, 3, 4 } };

(taken from http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html)

于 2013-12-01T08:41:35.560 回答