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?