首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >strdup()的用法

strdup()的用法
EN

Stack Overflow用户
提问于 2013-08-27 22:27:08
回答 3查看 1.5K关注 0票数 4

假设我们有一个结构:

代码语言:javascript
复制
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);
}

其主要职能如下:

代码语言:javascript
复制
  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有那个记忆吗?而这种情况又有什么不同呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-27 22:41:15

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

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

您没有解释您所说的“不使用strdup()函数”是什么意思。没有它你的代码是什么样子的?如果你这么做了

代码语言:javascript
复制
who->name = name;

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

票数 5
EN

Stack Overflow用户

发布于 2013-08-27 22:43:11

Mallocing结构为指针名称分配内存,但它没有为要指向的名称分配任何内存。在这一点上,谁->名称将是一些随机的垃圾值,所以释放它是没有意义的。

Str举在内部使用malloc为其复制的字符串分配内存。一旦你得到了一个指针,你可以,也应该,当你完成的时候释放它。

票数 0
EN

Stack Overflow用户

发布于 2013-08-27 22:32:58

不需要调用malloc,它只是字符串操作。您只能malloc指向结构的指针,而不是内部成员。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18476501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档