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 pamati!");
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 */ |
|