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

如果我有这样的function:

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

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

如果我写这个函数:

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

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

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

alloca在堆栈上分配并且不知道作用域,因此在离开堆栈帧后(=离开函数后)它被释放。

当函数退出时,使用alloca()分配的内存将被释放。 有关详细信息,请参阅手册页 。

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