由变量给出的C数组大小

时间:2015-07-27 13:33:05

标签: c arrays

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

#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;
}

并不是说它更美观,但我只是想知道。

2 个答案:

答案 0 :(得分:9)

摘录

int foo[x];

正在谈论称为VLA(Variable length array)功能的优势。它是在C99标准中引入的,只是为了C11中的可选功能。

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

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

答案 1 :(得分:2)

  

数组foo在堆栈上,所以如何通过x扩展?

gcc只是移动堆栈指针:

subq    %rax, %rsp

Link to full example with assembly output