由变量给出的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输出的完整示例