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

标签 c arrays alloca

我读过很多地方说 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/

相关文章:

c - 如何从 C/汇编中的内存地址执行函数?

c - C程序中struct和union如何分配内存?

arrays - 按值从高到低对哈希数组进行排序

c - C 中的数组声明和指针赋值

gcc - 了解 GCC 的 alloca() 对齐和看似错过的优化

c++ - 指向未知边界数组的指针?

c - C 中的外部命令行子进程在结束之前不会给出输出

c - 是否可以在 Linux 上预测 C 中的堆栈溢出?

javascript - Javascript 中 boolean 值和数组的困难

c - alloca() 和 setjmp 的作用是什么?