..
char arKey[1]; } Bucket;
以上据说是flexible array
,怎么样?
答案 0 :(得分:2)
通常,结构的最后一个成员的大小为0
或1
(尽管0
与标准的C99之前相比,但在某些编译器中它是允许的,因为它很棒作为标记的价值)。由于人们通常不会创建一个大小为0
或1
的数组,这向其他编码人员表明该字段用作可变大小数组的开头,从最终成员扩展到任何可用内存
您还可以找到定义灵活数组的确切长度的结构的成员,就像您经常找到包含结构的总大小(以字节为单位)的成员一样。
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
指针(必须是结构的最后一个成员)将导致访问额外的内存,从而有效地实现可变大小的对象。
有关详细信息,请参阅此页: