问题描述
根据一本名为《 alloc( )
》的书,为什么将func(x,alloca(size),z);
作为参数调用到另一个类似the linux programming interface
的函数中呢?
这是因为alloca()分配的堆栈空间将出现在 函数参数的空间(它们放置在 堆栈框架)。相反,我们必须使用如下代码:
void *y; y = alloca(size); func(x,y,z);
这是错误的
func(x,z); /* WRONG! */
不是应该认为那两个是等价的。在第一个中首先调用alloca
,然后再调用func
并返回它的返回值,所以如果有人可以解释{{1} }在堆栈上分配使两种方法不同的内存。
解决方法
alloca
手册页在“错误”部分中提到了这一点:
在许多系统上,不能在参数列表内使用alloca() 函数调用,因为alloca()保留了堆栈空间 将出现在函数中间的堆栈中 争论。
例如在func(x,alloca(1000),z);
中,您可能会以类似
sp+100c: x
sp+1008: .... space reserved by alloca
sp+ 8:
sp+ 4: sp+8 (return value of alloca())
sp+ 0: z