0

为什么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! */

不是这两个部分应该是等价的吗?在第一个allocafunc调用时,它的返回值被调用,所以如果有人可以解释如何alloca在堆栈上分配内存,这使得两种方法都不同。

4

1 回答 1

1

alloca手册页在 BUGS 部分中提到了这一点:

在许多系统上 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

常见的 ABI 要求 的参数位于和func(void *, void *, void *)的位置。预计布局类似于[sp + 0][sp + 4][sp + 8]

 sp+100c:    .... end of space reserved by alloca
 sp+   c:    .... space reserved by alloca
 sp+   8:    x
 sp+   4:    sp+0x0c (return value of alloc())
 sp+   0:    z
于 2020-09-16T13:31:56.310 回答