我正在浏览普林斯顿大学的一些讲座幻灯片,并有一个问题。教授有以下代码片段(在幻灯片 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()
函数返回后就会消失。
变量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()
代码。
变量t
存在于堆栈上,但它指向的东西(通过调用malloc
)存在于堆上。
当您返回t
时,您将返回它的值,即分配的内存上的地址。然后将其分配给调用方中的局部变量。如果您没有在调用方中分配它,则会出现内存泄漏。在某些时候,您将需要调用free
以释放内存并避免内存泄漏。
是的,您可以返回存储在 t
中的值,因为该值已复制到调用方,但不应返回指向t
的指针或引用,因为t
会消失并且此类指针或引用无用。
>t
不会在堆栈上。您可以从函数返回t
。 malloc
会记住分配的内存,直到您调用free