当前位置:  开发笔记 > 运维 > 正文

有人可以在Solaris中解释这个'dirent'结构的定义吗?

如何解决《有人可以在Solaris中解释这个'dirent'结构的定义吗?》经验,为你挑选了3个好方法。

最近我看着'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;

特别是d_name字段.这在操作系统中如何工作?如果你需要存储一个空终止字符串,那么单个字符串的数组有什么用?我知道你可以通过它的第一个元素获得数组的地址,但我仍然感到困惑.显然有些事情正在发生,但我不知道是什么.在我家的Fedora Linux系统上,这个字段简单地定义为:

char d_name[256];

现在,由于显而易见的原因,这更有意义.有人可以解释为什么Solaris头文件定义结构吗?



1> Rob Kennedy..:

正如其他人指出的那样,结构的最后一个成员没有任何设置大小.然而,数组很长,实现决定它需要容纳它想要放入其中的字符.它通过动态分配struct的内存来实现,例如with 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版本相同的功能,除了没有错觉结构本身可以包含任何名称.你知道通过它看它还有更多.

使用"灵活"声明,将调整占用的内存量,如下所示:

sizeof(dirent) + strlen(d.d_name) + 1

那是因为灵活的数组成员不会考虑结构的大小.

您没有经常看到类似灵活声明的原因,特别是在OS库代码中,可能是为了与不支持该工具的旧编译器兼容.它也与编写为目标定义的代码兼容,如果结构的大小改变那么会破坏.



2> Rob K..:

dirent结构将在内存中立即跟随包含名称其余部分的内存块,并且该内存可通过d_name字段访问.



3> Commodore Ja..:

这是C中用于指示结构末尾的任意长度数组的模式.C中的数组没有内置边界检查,因此当您的代码尝试访问从d_name开始的字符串时,它将继续超出结构的末尾.这依赖于readdir()将分配足够的内存来保存整个字符串加上终止的nul.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有