2

我的结构如下

typedef struct Mystruct{
char *name;
int telno;
struct Mystruct *nextp;
}data;

现在我 malloc 结构

data *addnode;
addnode = malloc (sizeof(data));

现在我将数据添加到char *name.

addnode->name = malloc (sizeof(MAX));

问题:为什么需要malloc再次?

我假设malloc-ingaddnode甚至会为其分配内存,addnode->name但事实并非如此。

4

3 回答 3

3

malloc不深也不做递归。因此它不会为您传递的结构内的任何指针分配内存。

如果你再想一想,你会发现一定是这样。您不会传递有关您正在分配的结构的任何信息。您只需传递内存块的大小。现在,malloc甚至不知道您分配的是什么类型的数据。它不知道块本身包含一个指针。

至于为什么做出这种设计选择,库如何知道谁拥有你的指针所指的内存?也许它属于那个结构。或者,也许您想使用该指针来引用在别处分配的一些内存。只有你才能知道这就是为什么责任落在你身上的原因。事实上,你的结构就是一个很好的例子。成员可能name由结构拥有,而nextp成员不是。

于 2012-12-10T11:36:19.350 回答
2

分配内存 为Mystruct指向 的指针提供了足够的内存name。在这一点上,我们不知道名称中有多少个字符,因此不可能为它分配内存。

如果您想在一次分配中完全分配结构,您可以决定最大大小name并将结构定义更改为

#define MAX_NAME (10) /* change this as required */
typedef struct Mystruct{
    char name[MAX_NAME];
    int telno;
    struct Mystruct *nextp;
}data;

或者,如果您在分配结构时知道名称,则可以通过提供构造函数向调用者隐藏两次分配的需要

struct Mystruct* Mystruct_create(const char* name)
{
    Mystruct* ms = malloc(sizeof(*ms));
    ms->name = strdup(name);
    return ms;
}
于 2012-12-10T11:36:01.080 回答
1

否。首先malloc()将内存分配给整个结构,包括用于保存指向名称的指针的内存。即 32 位操作系统中的 4 个字节。

您需要单独分配内存以在其中保存数据。默认情况下,如果未初始化,该指针将指向某个垃圾位置。

同样的情况free()。即你必须先释放内部块,然后释放整个结构的内存。中没有递归之类的东西malloc() and free()

于 2012-12-10T11:34:51.123 回答