从另一个函数调用参数调用alloca?

问题描述

根据一本名为《 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