如何在c中实现灵活的数组?

时间:2010-11-16 08:07:37

标签: c arrays

..
char arKey[1]; } Bucket;

以上据说是flexible array,怎么样?

2 个答案:

答案 0 :(得分:2)

通常,结构的最后一个成员的大小为01(尽管0与标准的C99之前相比,但在某些编译器中它是允许的,因为它很棒作为标记的价值)。由于人们通常不会创建一个大小为01的数组,这向其他编码人员表明该字段用作可变大小数组的开头,从最终成员扩展到任何可用内存

您还可以找到定义灵活数组的确切长度的结构的成员,就像您经常找到包含结构的总大小(以字节为单位)的成员一样。

链接

实施例

typedef struct {
    size_t len;
    char arr[];
} MyString;

size_t mystring_len(MyString const *ms) { return ms->len; }

MyString *mystring_new(char const *init)
{
    size_t len = strlen(init);
    MyString *rv = malloc(sizeof(MyString) + len + 1);
    rv->len = len;
    strncpy(rv->arr, init, len);
    return rv;
}

答案 1 :(得分:0)

灵活数组在C99中的长度应为0。使用大小1是C90,现在已弃用。

基本上,这种灵活的数组是通过malloc调用sizeof(Bucket) + array_length来创建的,其中array_length是数组所需的大小。然后,取消引用arKey指针(必须是结构的最后一个成员)将导致访问额外的内存,从而有效地实现可变大小的对象。

有关详细信息,请参阅此页:

http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html