C char指针动态分配 - 指定未知长度的值

时间:2013-06-30 05:28:57

标签: c pointers char

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

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

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

提前致谢。

2 个答案:

答案 0 :(得分: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()返回指向dirent结构的指针。 (这个   结构可以静态分配;不要试图释放(3)它。)

显然readdir为你分配内存。

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

答案 1 :(得分:1)

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

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