引用BUGS
部分的第二段,摘自alloca(3)
的手册
在许多系统中,
alloca()
不能在函数调用的参数列表中使用,因为alloca()
保留的堆栈空间将出现在函数参数空间的中间。
我看不出这是怎么回事。以下列代码为例:
void f(int a, void * b, int c);
int
main(void)
{
f(1, alloca(100), 2);
}
根据我的理解,alloca
将main
的堆栈帧扩展到100个字节(通过修改堆栈指针寄存器),然后将指向堆栈内存块(连同2int
)的指针传递给f
的堆栈帧。因此,所分配的空间不应该位于a
、b
或c
的中间,实际上它应该位于另一个框架上(在本例中是main
的框架上)。
这里有什么误会?
发布于 2017-01-29 10:19:24
首先,马上注意到这个是。它是对那些希望给程序员提供更多方法的平台的扩展,这些平台可能会动态地消耗自动变量空间,以提高基于其他技术(堆等)的慢动态内存分配程序的速度。(是的,我的观点,但里面有很多事实)。
尽管如此,请考虑以下几点:
你以前写过编译器吗?函数参数的评价顺序没有标准的保证。。因此,假设某个平台选择构建调用f
的f
,最终将以下内容推入激活堆栈,从右到左(他们的选择):
alloca(100)
,它将保存由另外100 char
构建的调用激活记录的相同堆栈吸下。void*
)的结果推入激活记录堆栈空间。call f
,将main
中的返回地址推入激活记录堆栈空间。现在,把自己看作是函数f
。您希望在哪里找到函数的第三个参数?嗯..。
这只是一个例子,说明如何将alloca
空间抛到某个可能导致问题的地方。
https://stackoverflow.com/questions/41919656
复制相似问题