可能是重复问题:
零长度数组
最近,我一直在阅读FUSE源代码,dirent结构体
定义如下:
struct fuse_dirent
{
__u64 ino;
__u64 off;
__u32 namelen;
__u32 type;
char name[0];
}
有人能解释一下这里的name[0]
是什么意思吗?它有什么作用?是用于填充和对齐吗?
可能是重复问题:
零长度数组
最近,我一直在阅读FUSE源代码,dirent结构体
定义如下:
struct fuse_dirent
{
__u64 ino;
__u64 off;
__u32 namelen;
__u32 type;
char name[0];
}
有人能解释一下这里的name[0]
是什么意思吗?它有什么作用?是用于填充和对齐吗?
我在微软的代码中看到过这种“模式”,通常是当对象中的结构体大小事先不知道时。
你不会用通常的方式分配它,但你可以做一些类似于:
struct fuse_dirent* data = malloc(sizeof(fuse_dirent) + ... );
然后您可以通过访问name
成员来访问额外的数据。
当然,这种做法不安全,所以您必须格外小心。
当分配此结构时,还将在末尾分配一些额外的空间以存储字符串。这样,可以通过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