分配了alloca的内存在函数结束时或范围结束时被释放?

时间:2011-03-23 15:23:08

标签: c stack allocation

如果我有这样的功能:

void bla(int size) {
    while(b){
        char tmp[size];
        ......
    }
}

tmp在while循环的每次迭代中被释放,对吗?

如果我写这个函数:

void bla(int size) {
    while(b){
        char* tmp = alloca(size);
        ......
    }
}

tmp在范围结束时或功能结束时被释放?

3 个答案:

答案 0 :(得分:8)

它将在函数结束时释放,但由于你在循环内调用alloca(),你可能会得到堆栈溢出。如果size在功能中没有变化,您应该在循环之前调用alloca()

答案 1 :(得分:3)

alloca在堆栈上分配并且不了解范围,因此在离开堆栈帧后(=离开函数后)它被释放。

答案 2 :(得分:2)

当函数退出时,将释放分配有alloca()的内存。有关详细信息,请参阅manual page

关于前一种情况,只是作用域中的一个自动变量,我不确定如何定义它被“释放”。您不能在定义它的范围之外引用它,如果它有一个初始化程序,它将在每次迭代时重新初始化。