C语言 如何释放从函数返回的指针


#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?如果是这样,当我需要退货时,这怎么可能?

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

是的(有点,请参阅我后来的评论)。 每次调用malloc都需要稍后调用free。 否则,您就会泄漏。 但请记住;你不是在"释放x",你是在释放X所指的记忆。

返回x将创建 x 的值(地址)的副本并将其返回给调用方。 x声明具有自动存储持续时间。它所指的记忆必须被释放。

如果是这样,当我需要退回它时,这怎么可能。

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

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

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

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

是的,您需要释放,但是当您在main中执行free(a);时,它已经被释放了(因为a被分配给第 a = f(); 行中的相等x)。

是的,它应该由调用方释放。比如你主free

当您在函数f中返回x时,地址的副本将传递回调用方。呼叫者可以通过该地址呼叫free

x

退出函数后被销毁。x 的值是指向动态分配对象的地址。退出函数后,该对象仍然存在。

若要释放动态对象,必须将 f 函数返回的 x 值传递给 free 函数。

当您调用malloc时,它会分配内存并返回该内存块的初始地址。

在您的情况下,您将此地址返回给被叫方,现在被叫方(主)负责解除分配它。

释放内存

块唯一需要的是初始地址,操作系统AFIK负责分配/释放内存,它使用相当复杂的算法,但程序只需要跟踪初始内存地址。这个地址可以像任何其他整数值一样存储或移动,因为在 32 位系统中,它只是一个 int 值。

你的代码工作得很好,你释放了a这是 f 错误定位的字符串。

相关内容

  • 没有找到相关文章

最新更新