strdup()的用法

时间:2013-08-27 22:27:08

标签: c struct segmentation-fault free

假设我们有一个结构:

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()有什么区别?

3 个答案:

答案 0 :(得分:5)

在您的代码中,每个Person对象涉及两个独立的内存块:struct Person对象本身和名称的单独内存块。该单独的内存块由结构内的name指针指向。使用struct Person分配malloc时,您没有为名称分配任何内存。它也是一个独立的内存块,应该独立分配。

您计划如何为名称分配内存完全取决于您。如果您使用strdup(基本上是malloc的包装器),就像上面的代码一样,那么您最终必须通过free释放它。

你没有用“没有strdup()函数”来解释你的意思。没有它你的代码是什么样的?如果你只是做了

who->name = name;

然后你使who->name指针直接指向文字"mike"占用的字符串文字内存。字符串文字驻留在静态内存中。您不能free他们。这就是valgrind告诉你的。

答案 1 :(得分:0)

对结构进行mallocing为指针名称分配内存,但它没有为要指向的名称分配任何内存。那时who-> name将是一些随机垃圾值,因此释放它是没有意义的。

strdup在内部使用malloc为它复制的字符串分配内存。一旦你有一个指针从strdup返回,你可以,而且应该在你完成后释放它。

答案 2 :(得分:-3)

strdup do noes调用malloc,它只是字符串操作。你只是malloc指向结构的指针,而不是内部成员