#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/