Как инициализация динамического массива квадратных скобок работает в C?

Я был очень удивлен, обнаружив, что следующий код работает так, как и ожидал бы один (новичок) (ну, я ожидал, что он либо не скомпилируется, либо segfault):

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int count = rand() % 1024 + 2;
    int arr[count];
    arr[count-1] = 3;
    for(int i = 0; i < count; ++i)
    {
        arr[i] = i * 3;
    }
    printf("%d %d %d", count - 1, arr[0], arr[count-1]);
    return 0;
}

К моему удивлению, это компилируется и работает.

Я не знал, что можно динамически выделить массив с помощью квадратных скобок, как это работает? Я ожидал какой-либо ошибки, указывающей, что динамическое выделение с использованием [] не разрешено или невозможно в C.

Как это работает?


person Gizmo    schedule 09.04.2018    source источник
comment
C99 добавил массивы переменной длины, так что это нормально   -  person Sami Kuhmonen    schedule 09.04.2018
comment
О, это объясняет, я не знал формулировки для поиска, переменная не пришла мне в голову :) теперь я могу найти больше информации об этом, спасибо!   -  person Gizmo    schedule 09.04.2018
comment
для этого и нужны дубликаты. Для людей, не знающих терминологию. В таком случае все в порядке.   -  person Jean-François Fabre    schedule 09.04.2018
comment
Ответ, который используется для дублированного состояния, описывает разницу между данными кучи и стека. Но это не отвечает на этот вопрос: allocate an array by using square brackets, how does this work?   -  person harper    schedule 09.04.2018