尾随数组成语
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)。以上是关于尾随数组成语的主要内容,如果未能解决你的问题,请参考以下文章