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

use*_*871 11 c memory malloc free dynamic

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

是否x必须释放函数中的变量?如果是这样,当我需要退货时,这怎么可能呢?

Ed *_* S. 10

是否必须释放函数中的变量x?

是的(有点,见我后来的评论).每次通话都malloc需要稍后拨打电话free.否则,你有泄漏.但请记住; 你不是"自由x",你正在释放x所指的记忆.

当您返回值的x一个副本(地址)并返回给调用者时. 声明具有自动存储持续时间.它所指的内存必须被释放.xx

如果是这样,当我需要返回时,这怎么可能.

您的设计将责任放在呼叫者身上以释放内存.你已经完成了这个.当然,使用此方法需要您记录该函数,以便代码的用户知道他们正在接收动态分配的内存地址.

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

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

另外,您应该始终检查返回值malloc.它可能会失败,在这种情况下将返回空指针.此外,sizeof(char)保证符合1标准,所以你可以删除该位,然后说malloc(n).