如何摆脱一个函数返回一个指针?(How do I free a pointer returned f

2019-07-30 21:48发布

#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的功能都将被释放? 如果是这样,怎么可能当我需要退货吗?

Answer 1:

是否在该函数的变量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] = '\0';
}

在一个侧面说明,你应该总是检查返回值malloc 。 它可能会失败,在这种情况下,一个空指针将被退回。 此外, sizeof(char)保证为1的标准,这样你就可以删除该位,只是说malloc(n)



Answer 2:

是的,它应该被调用者释放。 如free在你的主。

当您返回x在功能f ,地址的副本被传递回调用者。 来电者可以拨打free在该地址。



Answer 3:

是的,你需要释放,但是当你做它已经被释放free(a);main (因为a指派为等于x的线a = f(); )。



Answer 4:

x退出后的功能被破坏。 的值x是指向动态分配对象的地址。 你退出功能后的对象仍然存在。

要释放动态对象,你必须通过的值x由返回f功能的free功能。



Answer 5:

当你调用malloc分配内存,并返回该内存块的起始地址。

在你的情况,你回到这个地址返回给被叫方,现在被叫方,主要是负责释放它。

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



Answer 6:

您的代码工作做好,你释放a是用f malloced的字符串。



文章来源: How do I free a pointer returned from a function?