如果我有这样一个函数:
void bla(int size) {
while(b){
char tmp[size];
......
}
}
tmp在while循环的每次迭代中都会被释放,对吗?
如果我写下这个函数:
void bla(int size) {
while(b){
char* tmp = alloca(size);
......
}
}
tmp在作用域结束时还是在函数结束时被释放?
如果我有这样一个函数:
void bla(int size) {
while(b){
char tmp[size];
......
}
}
tmp在while循环的每次迭代中都会被释放,对吗?
如果我写下这个函数:
void bla(int size) {
while(b){
char* tmp = alloca(size);
......
}
}
tmp在作用域结束时还是在函数结束时被释放?
该变量将在函数结束时被释放,但由于您在循环中调用了alloca()
,因此可能会出现堆栈溢出。如果size
在函数内部没有改变,则应在循环之前调用alloca()
。
alloca
在堆栈上分配内存,并且没有关于作用域的知识,所以在离开堆栈帧(即退出函数后)之后会被释放。
alloca()
函数分配的内存会在函数退出时被释放。如果需要更多信息,可以参考手册页面。
对于前一种情况,即在作用域中只有一个自动变量,我不确定如何定义它何时被“释放”。您无法在定义它的作用域之外引用它,如果它有一个初始化器,则会在每次迭代中重新初始化。
alloca
。实际上,这是VLA和alloca
之间的主要区别 - 自动数组的作用域为块作用域,而alloca
的作用域为函数作用域。 - R.. GitHub STOP HELPING ICE