c - 为什么不能在函数参数列表中使用 alloca?

标签 c stack allocation alloca

引用 BUGS 部分的第二段,来自 alloca(3) 的联机帮助页

On many systems alloca() cannot be used inside the list of arguments of a function call, because the stack space reserved by alloca() would appear on the stack in the middle of the space for the function arguments.

我没看到这是怎么发生的。以下面的代码为例:

void f(int a, void * b, int c);

int
main(void)
{
    f(1, alloca(100), 2);
}

根据我的理解,allocamain 的堆栈帧向下扩展 100 字节(通过修改堆栈指针寄存器),然后指向该堆栈内存块的指针(连同 2 个 int) 在 f 的堆栈帧上传递。所以分配的空间不应该在abc中间,实际上它应该在不同的框架上(这是在这种情况下,在 main 的框架上)。

那么这里有什么误解呢?

最佳答案

首先,请注意 alloca is not standard .它是对平台的扩展,希望通过潜在地动态消耗自动变量空间来为程序员提供更多挂起自己的方法,以提高速度,而不是基于其他技术(堆等)的缓慢动态内存分配器。 (是的,我的意见,但其中有很多道理)。

也就是说,考虑一下:

你以前写过编译器吗? There is no standard guarantee of evaluation order of function arguments .所以假设一些平台选择构建 activation record通过最终将以下内容从右到左(他们的选择)插入激活堆栈来调用 f:

  1. 将 2 压入激活记录堆栈空间。
  2. 执行 alloca(100),它吸收 相同的堆栈 保存由另外 100 个 char 构建的调用激活记录。
  3. 将 (2) 的结果,一个 void* 插入激活记录堆栈空间。
  4. 将 1 压入激活记录堆栈空间。
  5. 调用call f,将main中的返回地址压入激活记录栈空间。

现在,把你自己想象成函数 f。您希望在哪里找到函数的第三个参数?嗯....

这只是一个例子,说明如何将 alloca 空间扔到可能导致问题的地方。

关于c - 为什么不能在函数参数列表中使用 alloca?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41919656/

相关文章:

c - C语言中,如何用指针计算一个字符串中有多少个元音字母?

c - 二叉树 - 打印叶到叶路径 [C]

c++ - C++中的双指针数组

microcontroller - C while 在数字范围之间循环

c - 在 C 中将匿名结构作为参数传递

java - 使用java在中缀到后缀应用程序中获取错误输出

c - 堆栈溢出损坏 %ebp

c++ - 使用堆栈库解码/封装文本文件 - 无法编码大文件 C++

c++ - 什么时候为程序分配内存?

c++ - 编译器控件如何帮助在 C++ 中分配和释放内存?