为什么char name [0]?

时间:2011-07-20 08:19:17

标签: c char

  

可能重复:
  zero length arrays

最近,我一直在阅读FUSE源代码,dirent struct的定义如下:

struct fuse_dirent
{
    __u64 ino;
    __u64 off;
    __u32 namelen;
    __u32 type;
    char name[0];
}

任何人都可以解释一下name[0]的含义吗?它是为了什么?填充和对齐?

2 个答案:

答案 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