如何释放函数返回的指针?
#include #include #include 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
被声明具有自动存储持续时间。 它所引用的内存必须被释放。
如果是这样,当我需要返回时,这怎么可能。
您的设计将责任放在呼叫者身上以释放内存。 你已经完成了这个。 当然,使用此方法需要您记录该函数,以便代码的用户知道他们正在接收动态分配的内存地址。
更好的方法(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)
。
是的,应该由呼叫者释放。 比如你的主要free
。
当您在函数f
返回x
时,地址的副本将传递回调用者。 呼叫者可以在该地址上free
拨打电话。
是的,你需要自由,但是当你自由时它已经被释放了free(a);
在main
(因为a
在行a = f();
被指定为等于x
)。
退出函数后, x
被销毁。 x
的值是指向动态分配的对象的地址。 退出函数后,该对象仍然存在。
要释放动态对象,必须将f
函数返回的x
值传递给free
函数。
当你调用malloc
它会分配内存并返回该内存块的初始地址。
在您的情况下,您将此地址返回给被调用者,现在被调用者main负责解除分配。
解除内存块所需的唯一内容是初始地址,AFIK负责分配/释放内存它使用相当复杂的算法,但程序只需要跟踪初始内存地址。 这个地址可以像任何其他整数值一样存储或移动,因为在32位系统中,它只是一个int值。
你编写的代码运行良好,你释放a
由f进行malloced的字符串。