c - 结构中的零长度数组有何用处?

标签 c arrays gcc

<分区>

引自this site ,

Zero-length arrays are allowed in GNU C. They are very useful as the last element of a structure that is really a header for a variable-length object.

代码:

 struct line {
   int length;
   char contents[0];
 };

 struct line *thisline = (struct line *)malloc(sizeof (struct line) + this_length);
 thisline->length = this_length;

我真的不明白他们的意思:“结构的最后一个元素实际上是可变长度对象的 header ”。有人可以详细说明这句话吗?

最佳答案

零长度数组(在 C99 中已被灵活数组成员取代)让您可以在一次分配中分配具有可变大小的结构,而不是两次分配。如果没有灵活的数组成员,您将被迫这样做:

struct line {
   int length;
   char *contents;
};

struct line *thisline = malloc(sizeof (struct line));
thisline->length = this_length;
thisline->contents=malloc(this_length);

灵活的数组成员使您无需进行第二次分配,也无需再次调用 free

除了方便之外,这个小技巧还可以帮助您节省内存开销。每次分配一 block 内存时,malloc 都需要存储一些“簿记”信息以供free 使用。此外,malloc 分配的 block 以特定的增量调整大小,在每个 block 的末尾留下小的未使用部分。通过将分配数量减少一半,您可以显着减少开销。

关于c - 结构中的零长度数组有何用处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27675864/

相关文章:

arrays - 在leetcode中的两个排序数组中找到K以找到中位数的算法是什么

javascript - 使用循环和条件语句比较数组中的元素

c++ "#include"输出说明

C、创建进程并等待

c++ - 为什么指针运算在这里不起作用?

c - 在内核模块中访问串口

c - 链接 C 程序时使用第一个出现的实现

c - 打印双向链表

c# - 如何在c#中将二维整数数组元素转换为字符串?

c++ - SFINAE 方法在 clang 中完全禁用基类的模板方法