假设我们有一个结构:
struct Person {
char *name;
};
struct Person *Person_create(char *name){
struct Person *who = malloc(sizeof(struct Person));
assert(who != NULL);
who->name = strdup(name);
return who;
}
void Person_destroy(struct Person *who){
assert(who != NULL);
free(who->name);
free(who);
}其主要职能如下:
int main(int argc,char *argv[]){
struct Person *mike = Person_create("mike");
Person_print(mike);
Person_destroy(mike);
return 0;
}上面的代码如果没有strdup()函数就不能正常工作。瓦兰德说,你想免费释放的地址(谁->名字)不是malloc'd‘,这背后的故事是什么,当我malloc破坏了结构时,不是malloc有那个记忆吗?而这种情况又有什么不同呢?
发布于 2013-08-27 22:41:15
在您的代码中,每个Person对象包含两个独立的内存块:struct Person对象本身和名称的单独内存块。该独立的内存块由结构内的name指针指向。使用struct Person分配malloc时,不会为名称分配任何内存。同样,它是一个独立的内存块,应该独立地分配。
您计划如何为名称分配内存完全取决于您。如果您像上面的代码一样使用strdup (本质上是malloc的包装器),那么最终您将不得不由free释放它。
您没有解释您所说的“不使用strdup()函数”是什么意思。没有它你的代码是什么样子的?如果你这么做了
who->name = name;然后使who->name指针直接指向文字"mike"占用的字符串文本内存。字符串文本驻留在静态内存中。你不允许free他们。这就是瓦伦奇告诉你的。
发布于 2013-08-27 22:43:11
Mallocing结构为指针名称分配内存,但它没有为要指向的名称分配任何内存。在这一点上,谁->名称将是一些随机的垃圾值,所以释放它是没有意义的。
Str举在内部使用malloc为其复制的字符串分配内存。一旦你得到了一个指针,你可以,也应该,当你完成的时候释放它。
发布于 2013-08-27 22:32:58
不需要调用malloc,它只是字符串操作。您只能malloc指向结构的指针,而不是内部成员。
https://stackoverflow.com/questions/18476501
复制相似问题