我在很多地方读到过alloca已经过时,不应该使用,而应该使用可变长度数组。
我的问题是:alloca完全可以被可变长度数组替代吗?
在我的特定实例中,我有如下所示的内容:
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的一个真正的好用?对于这个示例,还假设出于某种原因,我希望在堆栈上分配值
发布于 2010-08-16 03:36:24
VLA和alloca之间有一个重要的区别:只要当前函数持续存在,alloca()返回的内存就是有效的。只要VLA的标识符保持在作用域中,VLA占用的内存的生命周期就是有效的。例如,你可以在循环中分配内存,并在循环外使用内存,VLA将会消失,因为当循环终止时,标识符会超出范围。这意味着,您可以使用alloca()和足够的堆栈空间来完成此操作:
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无法做到这一点。
发布于 2010-08-16 13:41:57
alloca完全可以被malloc和free替代。这是一个稍微多一点的工作,但除非你非常小心,否则这是必不可少的。几乎所有使用alloca或C99 vla的代码都容易受到堆栈溢出攻击,并且在许多实现中,它们可能导致权限提升。没有可移植的方法来知道堆栈有多大或者还有多少堆栈空间(或者编译器的内部使用或进一步的函数调用可能需要多少超出请求大小的开销),所以让vla/alloca安全的唯一合理的方法就是对所支持的数据大小施加极小的人为限制(例如几kb)。在这一点上,您可能只使用普通的非可变长度的自动对象...
https://stackoverflow.com/questions/3488821
复制相似问题