2014-12-28 49 views
2

this site引用,结构中的零长度数组如何有用?

零长度数组被允许在GNU C.它们是因为这是真的用于可变长度对象的报头的结构的最后一个元素是非常有用的。

代码:

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

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

我真的不明白他们有什么用这意味着:“这确实是一个可变长度的对象头结构的最后一个元素”。有人可以详细说明这句话吗?

+0

我认为你通常不会回答问题:D(p.s.很好的问题) – Rizier123

+2

标题是一个东西,是在一开始的东西。您拥有动态分配的可变内存量;在它的开头是你的普通结构字段(头部),剩余的内存就是数组。 –

+2

问题是,你可以'malloc'获得比'struct line'更多的空间,然后使用'malloc'返回的内存是连续的这一事实,通过'thisline-> contents [i]引用该额外空间' 。 –

回答

4

零长度阵列(其已被替换柔性阵列成员在C99)让你分配具有可变尺寸的结构在一个单一的分配而不是两个分配。如果没有灵活的数组成员,你将不得不这样做:

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

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

灵活的阵列成员作出第二次拨款为您节省,也不必调用free第二次。

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

1

我真的不明白他们的意思是:“结构的最后一个元素是真正的变长对象的头部”。

这意味着这是确定(在GNU C):

struct line { 
    int length; 
    char contents[0]; // OK, last member of the structure 
}; 

但这不是:

struct line { 
    char contents[0]; // Wrong, not the last member of the structure 
    int length; 
}; 
3

这是老C.与当前C99C11标准,你可以使用灵活阵列成员(它应该是struct的最后一个成员)like:

struct line { 
    unsigned length; 
    char contents[]; 
}; 

并且您需要一个约定灵活数组占用大小的约定。如果contents是一个C字符串(就像我们所期望的那样),那么可以假设它的大小为length+1(因为您需要终止空字节)。那么你应该评论一下。

参见this & that