L'allocazione dinamica si usa quando c'è la necessita di creare qualcosa a runtime.
Ad esempio stai usando un array troppo piccolo e te ne serve uno più grande. Ne allochi uno, ricopi il vecchio e usi solo quello nuovo. Con l'allocazione fai richiesta al sistema operativo di una zona di memoria, dichiarando che ne sei responsabile. Quando non ti serve più la liberi.
In C si usanomalloc(), realloc() e free() per gestire le allocazioni.
In C++ new e delete.
Per quanto riguarda il C99.
Il C99 è la ratifica ufficiale di una serie di estensioni introdotte da GCC che miravano a svecchiare il C. A parte Gcc non so quanti altri compilatori lo supporti. Introduce i VLA (variable lenght array) che spesso danno più problemi di quanti ne risolvano e soprattutto stravolge le abitudini di molti programmatori C, i quali continuano a usare il buon vecchio C89.