Dynamická pole

Pole alokovaná na zásobníku by měly mít velikost danou při překladu programu, často ale potřebujeme vytvářet pole v závislosti na vstupu programu. Například, pokud bychom chtěli vytvořit pole, které by obsahovalo všechny řádky souboru, tak dopředu nevíme, kolik těch řádků bude nějaký konkrétní soubor mít.

Ze sekce o dynamické paměti již víme, jak alokovat libovolné množství paměti na haldě pomocí funkce malloc. Pro vytvoření dynamického pole (dynamic array) tak stačí použít funkci malloc. Například pro vytvoření dynamického pole pro 5 celých čísel potřebujeme naalokovat 5 * sizeof(int) bytů:

int* pole = (int*) malloc(5 * sizeof(int));

S takovouto pamětí pak můžeme pracovat jako s polem intů o velikosti 5. Jakmile již takovéto pole nepotřebujeme, nesmíme jej samozřejmě zapomenout uvolnit.

Změna velikosti pole

Občas potřebujeme velikost dynamického pole změnit (obvykle zvětšit). Například pokud vám uživatel zadává na vstupu seznam čísel, na začátku můžete vytvořit paměť pro 10 čísel, ale při zadání 11. čísla musíte tuto paměť zvětšit, jinak byste neměli nové číslo kam zapsat. Tento proces se nazývá realokace (reallocation) a lze jej provést například následujícím způsobem:

  1. Naalokujeme nové dynamické pole o požadované velikosti
  2. Zkopírujeme obsah původního pole do nového pole
  3. Uvolníme paměť původního pole
  4. Upravíme odpovídající ukazatel(e) v programu, aby ukazoval(y) na nově naalokované pole

Pokud se vám toto nechce programovat ručně, tak můžete také použít funkci realloc ze standardní knihovny C, která to udělá za vás. Tato funkce očekává původní adresu alokace z malloc/calloc a počet bytů nové alokace.


Cvičení 🏋

Zkuste naprogramovat funkci realokace, která obdrží dynamicky naalokované pole (tedy ukazatel), jeho původní velikost a novou velikost. Funkce realokuje pole na novou velikost a vrátí ukazatel na nově naalokované pole.