我今天发现一些令我困惑的代码。 它做了这样的事情:
#include <stdio.h>
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 <stdio.h>
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;
}
并不是说它更美观,但我只是想知道。
答案 0 :(得分:9)
摘录
int foo[x];
正在谈论称为VLA(Variable length array)功能的优势。它是在C99
标准中引入的,只是为了C11
中的可选功能。
这样,我们就可以创建一个数组数据结构,其长度在运行时给定(提供)。
需要注意的是,虽然在运行时创建,gcc
会在堆栈内存上分配VLA(与堆内存中的动态内存分配不同)。
答案 1 :(得分:2)