如果我有这样的功能:
void bla(int size) {
while(b){
char tmp[size];
......
}
}
tmp在while循环的每次迭代中被释放,对吗?
如果我写这个函数:
void bla(int size) {
while(b){
char* tmp = alloca(size);
......
}
}
tmp在范围结束时或功能结束时被释放?
答案 0 :(得分:8)
它将在函数结束时释放,但由于你在循环内调用alloca()
,你可能会得到堆栈溢出。如果size
在功能中没有变化,您应该在循环之前调用alloca()
。
答案 1 :(得分:3)
alloca
在堆栈上分配并且不了解范围,因此在离开堆栈帧后(=离开函数后)它被释放。
答案 2 :(得分:2)
当函数退出时,将释放分配有alloca()
的内存。有关详细信息,请参阅manual page。
关于前一种情况,只是作用域中的一个自动变量,我不确定如何定义它被“释放”。您不能在定义它的范围之外引用它,如果它有一个初始化程序,它将在每次迭代时重新初始化。