尾随数组成语

Posted

技术标签:

【中文标题】尾随数组成语【英文标题】:Trailing Array Idiom 【发布时间】:2011-05-13 00:42:48 【问题描述】:

什么是尾随数组习语

P.S : 谷歌搜索这个术语给出了向量是使用尾随数组习语实现的,因此如果不改变向量对象本身的地址,它们就无法调整大小。

【问题讨论】:

正如其他人在下面的一些答案中所评论的那样,您在搜索 flexible array member 时会有更好的运气。 请注意,根据严格的定义,这会调用 UB:***.com/questions/3711233/… 【参考方案1】:

如果您指的是GCC source code(您的引用来自哪里)中提到的尾随数组习语,它似乎是指实现动态数组的旧 C 技巧:

typedef struct 
    /* header */
    size_t nelems;

    /* actual array */
    int a[1];
 IntVector;

创建数组的位置

IntVector *make_intvector(size_t n)

    IntVector *v = malloc(sizeof(IntVector) + sizeof(int) * (n-1));
    if (v != NULL)
        v->nelems = n;
    return v;

【讨论】:

如果是指那个,更常用的术语是struct hack。 @Georg:我不认为(虽然我不确定)它指的是否则术语(如你所提到的)struct hack 将被用来代替Trailing array idiom @Prasoon:作者可能只是使用了不同的术语,这不是第一次有人这样做。无论如何,“Struct hack”听起来有点不正式。 @Prasoon,这条评论给出了它:“这意味着你不能有向量类型的变量或字段——总是使用指向向量的指针。一个例外是结构的最终字段,这可能是一个向量类型。”我承认我也从未听说过它被称为“尾随数组习语”,但它是有道理的。 @Georg Fritzsche:具有讽刺意味的是,标准中出现了“struct hack”一词。【参考方案2】:

它似乎是指结构中的数组,它可能具有可变的数组大小。见:

http://blogs.msdn.com/b/oldnewthing/archive/2004/08/26/220873.aspx 和 http://sourceware.org/gdb/current/onlinedocs/gdbint/Support-Libraries.html

另一个提示,如果您在谷歌上搜索表达式,请将表达式放入“”中,例如“尾随数组”,这将为您提供更具体的结果。 Google 知道尾随数组。

【讨论】:

【参考方案3】:

我想的意思是:

struct foo 
  ... some data members, maybe the length of bar ...
  char bar[]; /* last member of foo, char is just an example */
;

通过与malloc(sizeof(struct foo)+LEN) 一起分配来使用它,其中LEN 是bar 的所需长度。这种方式只需要 一个 malloc。 [] 只能与最后一个结构成员一起使用。

而且,据我了解 GCC 文档,struct foo 也只能(合理地)用作另一个结构的最后一个成员,因为存储大小不固定 - 或作为指针。

【讨论】:

这称为“灵活数组成员”,符合 C99 标准 (§6.7.2.1P16)。

以上是关于尾随数组成语的主要内容,如果未能解决你的问题,请参考以下文章

最好的 c# 语法/成语,从 Facebook 读取朋友数组

从 C# 中的字节数组中删除尾随空值

数组和对象中的尾随逗号是规范的一部分吗?

数组和对象中的尾随逗号是规范的一部分吗?

无论我是不是将尾随逗号放入数组中,性能是不是存在差异?

您可以在 JSON 对象中使用尾随逗号吗?