Размер массива 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