零长度数组
==========
GNU C 允许使用零长度数组,在定义变长对象的头结构时,这个特性非常有用。例
如:
++++ include/linux/minix_fs.h
struct minix_dir_entry {
__u16 inode;
char name[0];
};
结构的最后一个元素定义为零长度数组,它不占结构的空间。在标准 C 中则需要
==========
GNU C 允许使用零长度数组,在定义变长对象的头结构时,这个特性非常有用。例
如:
++++ include/linux/minix_fs.h
struct minix_dir_entry {
__u16 inode;
char name[0];
};
结构的最后一个元素定义为零长度数组,它不占结构的空间。在标准 C 中则需要
定义数组长度为 1,分配时计算对象大小比较复杂。
标准C中不能这么写,数组大小至少为1:
struct minix_dir_entry {
__u16 inode;
char name[1];
};
那么怎么使用这个零长度数组呢,申请内存时,写:
struct minix_dir_entry *dir = malloc(sizeof(struct minix_dir_entry) + LENGTH);
LENGTH值你就可以自己定了,但是你这个struct minix_dir_entry真正占用的空间大小,无法再用sizeof操作来求取,有时需要在struct minix_dir_entry里加入个域值,比如int length;申请完内存后,将上面LENGTH值放入结构中的这个length。以后就可以求出内存的边界了,不然都不知道内存边界在哪里。
主要参考:
[精华] gcc核心扩展linuxforum转贴] http://www.chinaunix.net 作者:lenn
http://www.chinaunix.net/jh/4/704815.html
[经验分享] Gcc 嵌套函数 与零长度数组的 使用 作者:huzht
http://dev.10086.cn/cmdn/bbs/thread-14884-1-1.html