Limbajul C permite utilizatorului să aloce date atât pe stivă (date automatice) cât și zone de memorie care nu aparțin stivei (date globale sau statice). Alocarea datelor pe stivă se face la execuție și ea nu este permanentă. Astfel, dacă declarația: tip nume; se utilizează în corpul unei funcții, atunci variabila nume se alocă pe stivă la fiecare apel al funcției respective. La revenirea din funcție, stiva se curăță și prin aceasta variabila nume nu mai este alocată. O alocare de acest tip a memoriei se numește dinamică.
Pentru datele globale sau statice, memoria este alocată în fazele precedente execuției și alocarea rămâne valabilă până la terminarea execuției programului. De aceea, pentru datele de acest fel se spune că alocarea este statică(nu este dinamică).
Limbajul C oferă posibilitatea de a aloca dinamic memorie și în alt mod decât cel indicat mai sus pentru datele automatice. Aceasta se realizează într-o zonă de memorie specială, diferită de stivă. Această zonă de memorie se numește memorie heap(memorie grămadă, morman, de acumulare). Ea poate fi gestionată prin funcții standard.