Matriz de tamanho variável na pilha [duplicado]

Esta pergunta já tem uma resposta aqui:

matriz de tamanho variável g ++ sem aviso? 1 resposta

Entendo que, em C e C ++, criamos estruturas de dados cujo tamanho é conhecido em tempo de compilação na pilha e usamos o heap (malloc-free / new-delete) para coisas cujo tamanho não é conhecido em tempo de compilação e é decidido no tempo de execução. Por que, então, meu compilador g ++ permite que eu faça algo parecido com o seguinte trecho de código.

int main(void)
{
    int n ;
    cin >> n ; // get the size of array.
    int arr[n] ; // create a variable sized array.
    .... do other stuff ...
}

Especificamente, no caso de uma matriz:
Uma matriz recebe um bloco contíguo de memória na pilha e há variáveis acima e abaixo na pilha, portanto, o tamanho da matriz deve ser conhecido para que a variável acima da matriz na pilha, a própria matriz e as variáveis abaixo a matriz na pilha pode caber perfeitamente na memória.Como, então, são implementadas matrizes de tamanho variável na pilha? Por que eles são necessários? Por que não podemos simplesmente usar o heap para buffers de tamanho variável?

EDITAR:
Entendo pelos comentários, que C e C ++ têm regras diferentes sobre se os VLA são padrão ou não e também o comentário de Neil Butterworth de que geralmente não é uma boa ideia fazer uma pergunta sobre dois idiomas ao mesmo tempo. Obrigado pessoal, por isso estou removendo a tag C da minha pergunta, pois pretendia perguntar principalmente sobre C ++, como é evidente pela sintaxe do snippet de código. Desculpe pela confusão e obrigado pelas respostas.

questionAnswers(1)

yourAnswerToTheQuestion