#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 错误定位的字符串。