Размер массива C определяется переменной

Сегодня я нашел код, который смутил меня. Он сделал что-то вроде этого:

#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 ответа

Решение

Фрагмент

int foo[x];

говорит о преимуществах функции, называемой VLA ( массив переменной длины). Это было введено в C99 стандарт, просто чтобы сделать дополнительную функцию в C11,

Таким образом, мы можем создать структуру данных массива, длина которой задается (предоставляется) во время выполнения.

Обратите внимание на то, что хотя и создано во время выполнения gcc выделяет VLA в памяти стека (в отличие от динамического выделения памяти из памяти кучи).

Массив foo находится в стеке, так как его можно расширить на x?

gcc просто перемещает указатель стека:

subq    %rax, %rsp

Ссылка на полный пример с выводом сборки

Другие вопросы по тегам