假设我们有一个结构:
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()函数,上面的代码将无法正常工作. Valgrind说你试图免费提供的地址(谁 – >名字)不是malloc’d.这背后的故事是什么,当我对结构进行malloc化时,我没有对内存进行malloc吗? strdup()有什么不同?
最佳答案 在您的代码中,每个Person对象都涉及两个独立的内存块:struct Person对象本身和名称的单独内存块.该单独的内存块由结构中的名称指针指向.使用malloc分配struct Person时,不会为名称分配任何内存.它也是一个独立的内存块,应该独立分配.
您如何计划为名称分配内存完全取决于您.如果你在上面的代码中使用strdup(它实际上是malloc的包装器),那么你必须在最后免费释放它.
你没有用“没有strdup()函数”来解释你的意思.没有它你的代码是什么样的?如果你只是这样做
who->name = name;
然后你让who-> name指针直接指向文字“mike”占用的字符串文字内存.字符串文字驻留在静态内存中.你不被允许释放它们.这就是valgrind告诉你的.