0

我对这里发生的事情感到很困惑。

while ( (ent = readdir(dir)) != NULL)
    {
        char *name = ent -> d_name;
        ....
    }

这只是扫描目录的一些基本代码。很公平。但我无法理解这是如何编译的,因为编译器如何以...的名义确定 ent -> d_name 的大小?没有人在编译时知道它,并且必须为此分配内存,对吗?编译器是自动为我 malloc() 还是什么?如果相关的话,我在 Ubuntu 下使用 GCC。

提前致谢。

4

2 回答 2

3
  • 编译器可以确定 ent -> d_name 的大小吗?

编译器不需要。

在 Linux 上,dirent结构定义如下:

struct dirent {
    ino_t          d_ino;       /* inode number */
    off_t          d_off;       /* offset to the next dirent */
    unsigned short d_reclen;    /* length of this record */
    unsigned char  d_type;      /* type of file; not supported
                                   by all file system types */
    char           d_name[256]; /* filename */
};

在这之后

char *name = ent -> d_name;

name只是指向数组的第一个元素ent->d_name

  • 编译器是自动为我 malloc() 还是什么?

这里

while ( (ent = readdir(dir)) != NULL)

readdir返回一个指向dirent结构的指针。

男人是这样说的:

成功时, readdir() 返回一个指向不同结构的指针。(这个结构可能是静态分配的;不要试图释放(3)它。)

显然readdir为您分配内存。

另请阅读:Why does the C readdir man page say to not call free on the static assigned result struct

于 2013-06-30T07:43:25.443 回答
1

也许我错过了显而易见的事情,但是如果name是 achar *ent->d_name是 a char *(它们应该是为了正确键入),那么肯定发生的所有事情就是一个指向char( name) 块的指针被设置为指向同一个块char另一个指针 ( ent->d_name) 指向的。

在我看来,没有内存分配正在进行。

于 2013-06-30T08:04:59.940 回答