Quando usar matriz de comprimento variável em C, mas quando uma alocação dinâmica?

Descobri o Variable Length Array em C99, mas parece que ele se comporta quase da mesma forma que o malloc + free.

As diferenças práticas que encontrei:

Manipulação de matriz muito grande:

unsigned size = 4000000000;
int* ptr = malloc(size); // ptr is 0, program doesn't crash
int array[size]; // segmentation fault, program crashes

Vazamento de memória: possível apenas na alocação dinâmica de array:

int* ptr = malloc(size);
...
if(...)
    return;
...
free(ptr);

Vida útil do objeto e possibilidade de retornar da função: a matriz alocada dinamicamente permanece até a memória ser liberada e pode ser retornada da função que alocou a memória.

Redimensionamento: é possível redimensionar apenas com ponteiros para a memória alocada.

Minhas perguntas são:

Quais são as diferenças (estou interessado em conselhos práticos)?Quais são os problemas que um programador pode ter com as duas formas de matrizes com comprimento variável?Quando escolher o VLA, mas quando a alocação dinâmica de array?O que é mais rápido: VLA ou malloc + free?

questionAnswers(2)

yourAnswerToTheQuestion