8. Dynamické premenné

8.2 Vytvorenie dynamickej premennej, funkcia malloc

Najčastejšie používanou funkciou pre vytvorenie dynamickej premennej je funkcia malloc. Jediným parametrom tejto funkcie je počet bajtov, ktoré chceme alokovať. Funkcia vráti ukazovateľ na vytvorenú dynamickú premennú, presnejšie pointer na typ void, ktorý je potrebné pretypovať na pointer na príslušný typ.

V prípade, že sa nepodarilo prideliť pamäť požadovanej dĺžky, vráti funkcia hodnotu NULL. Je dobrým zvykom pri každom pridelovaní pamäti testovať návratovú hodnotu a nespoliehať sa na to, že pamäte musí byť predsa vždy dosť.


Je prirodzené, že ako parameter funkcie malloc nemá zmysel uvádzať len tak nejaké náhodné celé číslo. V programe je rozumné požadovať pamäť takej veľkosti, aby postačila práve na uloženie príslušnej premennej resp. štruktúry. Ak však potrebujeme alokovať pamäť napr. pre uloženie hodnoty int, tak príkaz
 
p_i = malloc(4)
 
nie je najvhodnejší, pretože je systémovo závislý – nie vždy musí typ int zaberať 4 bajty! Lepší je tento spôsob:
 
p_i = (int*)malloc(sizeof(int));
 
Operátor sizeof zistí veľkosť skúmaného údajového typu v bajtoch, čo v prípade štruktúrovaných údajových typov ako záznam či pole môže byť zložitejšie. Jeho použitie prispieva k dobrej čitateľnosti programu. Samotný program navyše nijako nezdržuje, lebo sa vyhodnocuje už v čase prekladu. Výsledok posledného volania funkcie malloc vidíme na obrázku:

Vytvorená dynamická premenná nemá zatiaľ definovanú hodnotu! Tú jej môžeme priradiť príkazom priradenia alebo ju načítame zo vstupu.

S vytvorenou dynamickou premennou môžeme pomocou pointera, ktorý na ňu ukazuje, pracovať rovnako ako s ktoroukoľvek inou premennou – v našom prípade typu int.


Príklady dynamickej alokácie pamäte – vytvorenia dynamických premenných (prvý aj s otestovaním návratovej hodnoty funkcie malloc vrátane reakcie na prípadný neúspech).

deklarujeme pointer: dynamicky alokujeme pamäť:
int *p;
if ((p = (int*)malloc(sizeof(int)))== NULL) {
	printf("Nedostatok pamate!");
	exit(1);
}
/* premenná typu int */
char *p; p = (char*)malloc(sizeof(char));
/* premenná typu char */
TOsoba *p; p = (TOsoba*)malloc(sizeof(TOsoba));
/* premenná typu TOsoba */
long *p; p = (long*)malloc(21 * sizeof(long));
/* pole 21 long-ov */
int **p; p = (int**)malloc(10 * sizeof(int*));
/* pole 10 pointerov na int */