#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] = '\0';
}
在一个侧面说明,你应该总是检查返回值malloc
。 它可能会失败,在这种情况下,一个空指针将被退回。 此外, sizeof(char)
保证为1
的标准,这样你就可以删除该位,只是说malloc(n)
是的,它应该被调用者释放。 如free
在你的主。
当您返回x
在功能f
,地址的副本被传递回调用者。 来电者可以拨打free
在该地址。
是的,你需要释放,但是当你做它已经被释放free(a);
在main
(因为a
指派为等于x
的线a = f();
)。
x
退出后的功能被破坏。 的值x
是指向动态分配对象的地址。 你退出功能后的对象仍然存在。
要释放动态对象,你必须通过的值x
由返回f
功能的free
功能。
当你调用malloc
分配内存,并返回该内存块的起始地址。
在你的情况,你回到这个地址返回给被叫方,现在被叫方,主要是负责释放它。
解除分配内存块唯一需要的是初始地址,AFIK操作系统负责分配/释放它使用相当复杂的算法内存,但程序只需要跟踪初始内存地址。 该地址可被存储或来回移动,就像任何其它的整数值,因为在32个的系统这就是所有它只是一个int值。
您的代码工作做好,你释放a
是用f malloced的字符串。