malloc两次为结构

时间:2012-12-10 11:33:26

标签: c structure

我的结构如下

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 addnode甚至会为addnode->name分配内存但事实并非如此。

3 个答案:

答案 0 :(得分:3)

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

如果你再多想一想,你可以看到必须如此。您不传递有关正在分配的结构的任何信息。您只需传递内存块的大小。现在,malloc甚至不知道您要分配的数据类型。它不知道块本身包含指针。

至于为何选择此设计,库如何告诉谁拥有指针所指的内存?也许它是由该结构所拥有的。或者您可能希望使用该指针来引用其他地方分配的内存。只有你能知道责任落在你身上的原因。事实上,你的结构就是一个很好的例子。可能name成员归结构所有,而nextp成员则不是。

答案 1 :(得分: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;
}

答案 2 :(得分:1)

没有。 first malloc()将内存分配给整个结构,包括用于保存指向name的指针的内存。即32位操作系统中的4个字节。

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

free()也是如此。即你必须首先释放内部块,然后释放整个结构的内存。 malloc() and free()中没有任何递归类型的东西。