为什么 d_reclen 变量

Why is d_reclen variable

我可以使用 sizeof 运算符精确地获取 struct dirent 的大小。在我的 PC 中它打印 280.Its dirent.h 中的定义如下。

struct dirent
  {
#ifndef __USE_FILE_OFFSET64
    __ino_t d_ino;
    __off_t d_off;
#else
    __ino64_t d_ino;
    __off64_t d_off;
#endif
    unsigned short int d_reclen;
    unsigned char d_type;
    char d_name[256];       /* We must not include limits.h! */
  };

它是correct.But 我还注意到d_reclen是一个显示记录长度的成员,它打印像24、32、40.etc这样的数字。 所以在记忆中,哪个是结构的实际大小?

sizeof() 显示 280 的事实,即使这反映了内存中结构的实际空间,也无关紧要。虽然 d_name 在这个 特定的 定义中是 [256],但 POSIX 将其定义为 d_name[],一个未指定大小的字符数组。根据目录名称的大小(更短/更长),确实应该能够在 d_reclen 中观察到不同的值,例如上例中的 24 或 32。

请参阅 man 页面中“注意事项”下的“d_name 字段”部分。

简而言之,在 d_name 上执行 sizeof() 是不正确的。应用程序应使用 d_reclen 或对 d_name 执行 strlen() 以了解名称长度。