最近,我正在研究“dirent”结构(在 dirent.h 中),对其定义有点困惑。
注意:此头文件来自我学校的 Solaris 计算机。
typedef struct dirent {
ino_t d_ino;
off_t d_off;
unsigned short d_reclen;
char d_name[1];
} dirent_t;
正如其他人指出的那样,结构的最后一个成员没有任何设置的大小。无论数组有多长,实现都会决定它需要容纳要放入其中的字符。它通过动态地为结构分配内存来实现这一点,例如使用malloc
.
不过,将成员声明为大小为 1 很方便,因为很容易确定任何成员占用了多少内存。dirent
多变的d
:
sizeof(dirent) + strlen(d.d_name)
使用大小 1 还会阻止此类结构值的接收者尝试在其中存储自己的名称而不是分配自己的名称dirent
价值观。使用 Linux 定义,可以合理地假设任何dirent
您拥有的值将接受 255 个字符的字符串,但 Solaris 不保证其dirent
值将存储超出其需要的字符。
我认为是 C 99 为结构体的最后一个成员引入了特殊情况。该结构可以这样声明:
typedef struct dirent {
ino_t d_ino;
off_t d_off;
unsigned short d_reclen;
char d_name[];
} dirent_t;
该数组没有声明大小。这被称为灵活的阵列成员。它完成了与 Solaris 版本相同的事情,只是不存在结构本身可以容纳的幻想any姓名。通过查看它,您就知道还有更多内容。
使用“灵活”声明,占用的内存量将如下调整:
sizeof(dirent) + strlen(d.d_name) + 1
这是因为灵活数组成员不考虑结构的大小。
您不经常看到这样的灵活声明的原因,尤其是在操作系统库代码中,可能是为了与不支持该功能的旧编译器兼容。它还为了与针对当前定义编写的代码兼容,如果结构的大小发生这样的变化,该代码就会中断。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)