由变量给出的C数组大小

我今天发现一些代码让我困惑。 它做了这样的事情:

#include  int main(int argc, char **argv) { int x = 5; int foo[x]; foo[0] = 33; printf("%d\n", foo[0]); return 0; } 

我的问题是为什么这有效?

数组foo在堆栈上,那怎么可以用x扩展呢?

我本以期待这样的事情:

 #include  int main(int argc, char **argv) { int x = 5; int foo[] = malloc(sizeof(int)*x); foo[0] = 33; printf("%d\n", foo[0]); free(foo); return 0; } 

我并不奇怪,这不是更漂亮或者更好。

片段

 int foo[x]; 

正在谈论称为VLA( 可变长度arrays )function的东西。 它是在C99标准中引入的,只是在C11作为可选function。

这样,我们就可以创建一个数组数据结构,其长度在运行时给定(提供)。

值得注意的是,虽然在运行时创建,但gcc会在堆栈内存上分配VLA(与堆内存中的动态内存分配不同)。

数组foo在堆栈上,那怎么可以用x扩展呢?

gcc只是移动堆栈指针:

 subq %rax, %rsp 

链接到assembly输出的完整示例