可能重复:
zero length arrays
最近,我一直在阅读FUSE源代码,dirent struct
的定义如下:
struct fuse_dirent
{
__u64 ino;
__u64 off;
__u32 namelen;
__u32 type;
char name[0];
}
任何人都可以解释一下name[0]
的含义吗?它是为了什么?填充和对齐?
答案 0 :(得分:0)
我在微软的代码中看到过这种“模式”,通常是在对象大小的结构不是先验的时候。
您不会以通常的方式分配它,但您可以执行以下操作:
struct fuse_dirent* data = malloc(sizeof(fuse_dirent) + ... );
然后您可以通过访问name
成员来访问额外数据。
当然,这种做法并不安全,所以你必须特别注意。
答案 1 :(得分:0)
分配此结构时,还会在末尾分配一些额外的空间来存储字符串。这样,可以通过fuse_dirent :: name访问该字符串,就像它是“真正的”char *
类型一样。它为[0]
的原因是不在fuse_direct
“标题中分配任何额外的空格。”
一个例子:
fuse_dirent *d = malloc(sizeof(fuse_dirent) + 3);
strcpy(d->name, "hi");
printf(d->name); // will print "hi" to the console