我的结构如下
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
分配内存但事实并非如此。
答案 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()
中没有任何递归类型的东西。