首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么不能在函数参数列表中使用alloca?

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

Stack Overflow用户
提问于 2017-01-29 10:03:19
回答 1查看 389关注 0票数 5

引用BUGS部分的第二段,摘自alloca(3)的手册

在许多系统中,alloca()不能在函数调用的参数列表中使用,因为alloca()保留的堆栈空间将出现在函数参数空间的中间。

我看不出这是怎么回事。以下列代码为例:

代码语言:javascript
运行
复制
void f(int a, void * b, int c);

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

根据我的理解,allocamain的堆栈帧扩展到100个字节(通过修改堆栈指针寄存器),然后将指向堆栈内存块(连同2int)的指针传递给f的堆栈帧。因此,所分配的空间不应该位于abc的中间,实际上它应该位于另一个框架上(在本例中是main的框架上)。

这里有什么误会?

EN

Stack Overflow用户

回答已采纳

发布于 2017-01-29 10:19:24

首先,马上注意到这个。它是对那些希望给程序员提供更多方法的平台的扩展,这些平台可能会动态地消耗自动变量空间,以提高基于其他技术(堆等)的慢动态内存分配程序的速度。(是的,我的观点,但里面有很多事实)。

尽管如此,请考虑以下几点:

你以前写过编译器吗?函数参数的评价顺序没有标准的保证。。因此,假设某个平台选择构建调用ff,最终将以下内容推入激活堆栈,从右到左(他们的选择):

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

现在,把自己看作是函数f。您希望在哪里找到函数的第三个参数?嗯..。

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

票数 8
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41919656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档