gpt4 book ai didi

c - alloca 是完全可替换的吗?

转载 作者:太空狗 更新时间:2023-10-29 16:59:01 29 4
gpt4 key购买 nike

我读过很多地方说 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 的一个实际用途吗?还假设对于这个例子,出于某种原因我希望在堆栈上分配值

最佳答案

VLA 和 alloca 之间有一个重要的区别:alloca() 返回的内存是有效的只要当前函数持续存在。只要 VLA 的标识符保留在范围内,VLA 占用的内存的生命周期就是有效的。例如,您可以在循环中 alloca() 内存并在循环外部使用内存,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 做到这一点。

关于c - alloca 是完全可替换的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3488821/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com