首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >alloca是完全可替代的吗?

alloca是完全可替代的吗?
EN

Stack Overflow用户
提问于 2010-08-16 03:12:20
回答 2查看 2.9K关注 0票数 9

我在很多地方读到过alloca已经过时,不应该使用,而应该使用可变长度数组。

我的问题是:alloca完全可以被可变长度数组替代吗?

在我的特定实例中,我有如下所示的内容:

代码语言:javascript
运行
复制
typedef struct { 
  int *value; 
  size_t size; 
  } some_type;

void SomeExternalFunction(some_type);

...

void foo(){
  //What I thought to do
  some_type bar;
  bar.value=alloca(sizeof(int)*10);
  SomeExternalFunction(bar);

  //what should be done without alloca
  some_type fizz;
  int tmp[10];
  fizz.value=tmp;
  SoemExternalFunction(fizz);
}

我是不是漏掉了什么,或者这是对alloca的一个真正的好用?对于这个示例,还假设出于某种原因,我希望在堆栈上分配值

EN

回答 2

Stack Overflow用户

发布于 2010-08-16 03:36:24

VLA和alloca之间有一个重要的区别:只要当前函数持续存在,alloca()返回的内存就是有效的。只要VLA的标识符保持在作用域中,VLA占用的内存的生命周期就是有效的。例如,你可以在循环中分配内存,并在循环外使用内存,VLA将会消失,因为当循环终止时,标识符会超出范围。这意味着,您可以使用alloca()和足够的堆栈空间来完成此操作:

代码语言:javascript
运行
复制
typedef struct node { int data; struct node *next; };
void fun()
{
 struct node *n=0;
 int d;
 /* Now we are building a single-linked list on the stack! */
 while(d=get_something()) {
  struct node *x=alloca(sizeof(*x));
  x->next=n; 
  x->data=d;
  n=x;
 }
 do_something_with(n);
} // and the whole thing is deleted here..

使用VLA无法做到这一点。

票数 24
EN

Stack Overflow用户

发布于 2010-08-16 13:41:57

alloca完全可以被mallocfree替代。这是一个稍微多一点的工作,但除非你非常小心,否则这是必不可少的。几乎所有使用alloca或C99 vla的代码都容易受到堆栈溢出攻击,并且在许多实现中,它们可能导致权限提升。没有可移植的方法来知道堆栈有多大或者还有多少堆栈空间(或者编译器的内部使用或进一步的函数调用可能需要多少超出请求大小的开销),所以让vla/alloca安全的唯一合理的方法就是对所支持的数据大小施加极小的人为限制(例如几kb)。在这一点上,您可能只使用普通的非可变长度的自动对象...

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3488821

复制
相关文章

相似问题

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