我正在经历普林斯顿大学的一些lecture slides并提出问题。教授有这段代码片段(在幻灯片8上):
struct Table *Table_create(void) {
struct Table *t;
t = (struct Table*)malloc(sizeof(struct Table));
t->first = NULL;
return t;
}
struct Table *t;
…
t = Table_create();
…
在Table_crate()
函数中,即使使用t
分配malloc
,t
本身也会位于堆栈上,对吗?
那么,你可以从这个函数返回t
吗?我认为t
中的Table_create()
会在函数返回后立即消失。
答案 0 :(得分:3)
变量t
具有自动存储持续时间。但这并不能阻止您从函数中返回值。
值本身(即malloc()
返回的指针)具有程序的生命周期(或直到您在其上调用free()
)。所以,这不是问题
从函数返回malloc()
' ed值。
如果有帮助,请考虑以下事项:
int func(int num)
{
int val;
val = num * 2; // take care of signed integer overflow!
return val;
}
此处返回val
是否与val
的生命周期有关(这是一个局部变量且具有自动存储持续时间)?不。这类似于您拥有的malloc()
代码。
答案 1 :(得分:1)
变量t
存在于堆栈中,但它指向的东西(通过调用malloc
)存在于堆上。
当您返回t
时,您将返回它的值,即已分配内存上的地址。然后将其分配给调用者中的局部变量。如果您没有在调用者中分配它,则会出现内存泄漏。在某些时候,您需要调用free
以释放内存并避免内存泄漏。
答案 2 :(得分:0)
是的,您可以返回存储在 t
中的值,因为该值已复制到调用者,但您不应该返回指针或对的引用t
因为t
会消失,而这些指针或引用也无用。
答案 3 :(得分:-1)
t
不在堆栈中。您可以从函数返回t
。在您致电malloc
free
会记住分配的内存