从另一个函数内部返回本地malloc()指针

时间:2016-06-06 15:37:43

标签: c malloc

我正在经历普林斯顿大学的一些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分配malloct本身也会位于堆栈上,对吗?

那么,你可以从这个函数返回t吗?我认为t中的Table_create()会在函数返回后立即消失。

4 个答案:

答案 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会记住分配的内存