c - 如何释放从函数返回的指针?

标签 c memory dynamic malloc free

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* f(void) {
  char *x;
  x = malloc(sizeof(char) * 4);
  strcpy(x, "abc");
  return(x);
}

int main(void) {
  char *a;
  a = f();
  printf("%s", a);
  free(a);
  return(0);
}

函数中的变量x是否必须被释放?如果是这样,我需要返回时怎么可能?

最佳答案

Does the variable x in the function have to be freed?

是的(有点,请参阅我稍后的评论)。每次调用 malloc 都需要稍后调用 free。否则,您有泄漏。但请记住;您不是“释放 [ing] x”,而是在释放 x 所指的内存。

当您返回 x 时,会生成 x(地址)的副本并将其返回给调用者。 x 被声明为具有自动存储持续时间。它所指的内存必须被释放。

If so how is that possible when I need to return it.

您的设计让调用者有责任释放内存。您已经在 main 中完成了此操作。当然,使用这种方法需要您记录函数,以便代码的用户知道他们正在接收动态分配的内存地址。

更好的方法 (IMO) 是将缓冲区作为输入参数。现在很清楚谁负责管理这个内存(即调用者)。也许我什至不想动态分配它。有了这个设计,这是我的选择。

void f(char *buf, size_t buf_size) {
  strncpy(buf, "abc", buf_size - 1);
  buf[buf_size-1] = '\0';
}

附带说明,您应该始终检查 malloc 的返回值。它可能会失败,在这种情况下将返回一个空指针。此外,标准保证 sizeof(char)1,因此您可以删除该位并只说 malloc(n)

关于c - 如何释放从函数返回的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11892962/

相关文章:

c# - 编码包含字符串的结构

java - Java中的线程何时从内存中删除?

javascript - Javascript 数组中的未定义值是否使用任何内存或在 for-in 循环中迭代?

c++ - 原生C++项目中,如何统计每个类的实例数和高峰时间消耗的内存

javascript - 如何在插入元素时高效执行 JavaScript 函数?

php - 根据用户输入更改 div 的内容?

c - 如何为数据预留一个固定的flash section?

c - 如果其他库中存在相同的函数,如何要求库使用其内部函数

dynamic - 删除 ldd 报告的未使用的库是否完全安全?

C代码在运行过程中挂起