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

时间:2020-09-16 13:00:41

标签: linux malloc alloca

根据一本名为《 alloc( )》的书,为什么将func(x, alloca(size), z);作为参数调用到另一个类似the linux programming interface的函数中呢?

这是因为alloca()分配的堆栈空间将出现在 函数参数的空间(它们放置在 堆栈框架)。相反,我们必须使用如下代码:

  void *y; 
  y = alloca(size); 
  func(x, y, z); 

这是错误的

func(x, alloca(size), z);  /* WRONG! */

不是应该认为那两个是等价的。在第一个中首先调用alloca,然后再调用func并返回它的返回值,所以如果有人可以解释{{1} }在堆栈上分配使两种方法不同的内存。

1 个答案:

答案 0 :(得分: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