2012-12-10 48 views
2

我有一个结构如下图的malloc两次结构

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

第一个'malloc'只是分配内存来存储'char * name'的指针.. –

+1

假设你的假设是正确的,'malloc'为'name'分配了空间指向,它会如何知道' MAX'是你需要的尺寸?它不知道,所以它不可能做你想要的。 –

+1

如果事先知道名称的长度(或者至少是最大可能的长度),则可以使用'char * name'的char name [MAX]。然后你不需要malloc了。 – Wutz

回答

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; 
} 
1

编号第一个malloc()将存储器分配给包括用于将指针保存到名称的存储器的整个结构。即32位OS中的4个字节。

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

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

3

malloc不深而没有做递归隐藏从主叫两个拨款的需要。所以它不会为你传递的结构中的任何指针分配内存。

如果你多想一想,你可以看到这一点。您不会传递任何关于您正在分配的结构的信息。你只是传递一个内存块的大小。现在,malloc甚至不知道你正在分配什么类型的数据。它不知道块本身包含一个指针。至于为什么选择这个设计,图书馆如何知道你的指针是指谁拥有内存?也许它是由这种结构所拥有的。或者你可能想用这个指针来指向其他地方分配的内存。只有你可以知道这是为什么责任落在你身上。事实上,你的结构就是一个很好的例子。成员可能是name拥有该结构,而nextp成员则不是。

+0

感谢您的一个很好的解释:) – Shash