strdup()的用法

bar*_*can 4 c free struct segmentation-fault

假设我们有一个结构:

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);
}
Run Code Online (Sandbox Code Playgroud)

主要功能:

  int main(int argc,char *argv[]){

  struct Person *mike = Person_create("mike");
  Person_print(mike);
  Person_destroy(mike);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

没有strdup()函数,上面的代码将无法正常工作.Valgrind说你试图免费提供的地址(who-> name)不是malloc'd.这背后的故事是什么,当我对结构体进行malloc化时,我没有对内存进行malloc吗?strdup()有什么不同?

AnT*_*AnT 5

在您的代码中,每个Person对象都涉及两个独立的内存块:struct Person对象本身和名称的单独内存块.name结构内部的指针指向单独的内存块.当您分配struct Person使用malloc,你是不是分配的名称的任何记忆.它也是一个独立的内存块,应该独立分配.

您如何计划为名称分配内存完全取决于您.如果您在上面的代码中使用strdup(实质上是一个包装器malloc),那么您最终必须释放它free.

你没有用"没有strdup()函数"来解释你的意思.没有它你的代码是什么样的?如果你只是这样做

who->name = name;
Run Code Online (Sandbox Code Playgroud)

然后你使该who->name指针直接指向文字占用的字符串文字内存"mike".字符串文字驻留在静态内存中.你不被允许free.这就是valgrind告诉你的.