Predtým, ako sa naučíte alokovať dynamickú pamäť C, poďme pochopiť:
Ako funguje správa pamäte v jazyku C?
Keď deklarujete premennú pomocou základného údajového typu, kompilátor C automaticky pridelí pamäťový priestor pre premennú v oblasti pamäte nazývanej zásobník .
Napríklad floatová premenná trvá pri deklarácii zvyčajne 4 bajty (podľa platformy). Tieto informácie môžeme overiť pomocou operátora sizeof, ako je uvedené v príklade nižšie
#includeint main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}
Výstup bude:
The size of float is 4 bytes
Pole so zadanou veľkosťou je tiež pridelené v súvislých blokoch pamäte, každý blok má veľkosť pre jeden prvok:
#includeint main() { float arr[10];printf("The size of the float array with 10 element is %d", sizeof(arr)); return 0;}
Výsledkom je:
The size of the float array with 10 element is 40
Ako sme sa zatiaľ dozvedeli, pri deklarácii základného dátového typu alebo poľa sa pamäť spravuje automaticky. Existuje však proces prideľovania pamäte v jazyku C, ktorý vám umožní implementovať program, v ktorom je veľkosť poľa nerozhodná, až kým nespustíte program (runtime). Tento proces sa nazýva „ Dynamické prideľovanie pamäte “.
V tomto návode sa naučíte
- Ako funguje správa pamäte v jazyku C?
- Dynamická alokácia pamäte v C
- Funkcia C malloc ()
- Funkcia free ()
- Funkcia C calloc ()
- calloc () vs. malloc (): kľúčové rozdiely
- Funkcia C realloc ()
- Dynamické polia
Dynamická alokácia pamäte v C
Dynamická alokácia pamäte je manuálne prideľovanie a uvoľňovanie pamäte podľa vašich programovacích potrieb. Dynamická pamäť sa spravuje a obsluhuje ukazovateľmi, ktoré ukazujú na novo pridelený pamäťový priestor v oblasti, ktorú nazývame halda.
Teraz môžete bez problémov dynamicky vytvárať a ničiť pole prvkov za behu. Ak to zhrnieme, automatická správa pamäte používa zásobník a funkcia C Dynamic Memory Allocation používa haldu.
Knižnica
Funkcia | Účel |
malloc () | Pridelí pamäť požadovanej veľkosti a vráti ukazovateľ na prvý bajt prideleného priestoru. |
calloc () | Prideľuje priestor pre prvky poľa. Inicializuje prvky na nulu a vráti ukazovateľ do pamäte. |
realloc () | Používa sa na úpravu veľkosti predtým prideleného pamäťového priestoru. |
Zadarmo() | Uvoľní alebo vyprázdni predtým pridelený pamäťový priestor. |
Poďme diskutovať o vyššie uvedených funkciách s ich aplikáciou
Funkcia C malloc ()
Funkcia C malloc () predstavuje alokáciu pamäte. Je to funkcia, ktorá sa používa na dynamické pridelenie bloku pamäte. Vyhradzuje si pamäťový priestor určenej veľkosti a vracia nulový ukazovateľ smerujúci na miesto v pamäti. Vrátený ukazovateľ je zvyčajne typu void. To znamená, že môžeme funkciu C malloc () priradiť ľubovoľnému ukazovateľu.
Syntax funkcie malloc ():
ptr = (cast_type *) malloc (byte_size);
Tu,
- ptr je ukazovateľ typu cast_type.
- Funkcia C malloc () vráti ukazovateľ na pridelenú pamäť byte_size.
Príklad malloc ():
Example: ptr = (int *) malloc (50)
Po úspešnom vykonaní tohto príkazu je vyhradený pamäťový priestor 50 bajtov. Adresa prvého bajtu vyhradeného priestoru je priradená smerníku ptr typu int.
Zvážte ďalší príklad:
#includeint main(){int *ptr;ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */if (ptr != NULL) {*(ptr + 5) = 480; /* assign 480 to sixth integer */printf("Value of the 6th integer is %d",*(ptr + 5));}}
Výkon:
Value of the 6th integer is 480
- Všimnite si, že namiesto sizeof (int ) sa použil sizeof (* ptr), aby bol kód robustnejší, keď sa deklarácia * ptr neskôr preleje na iný dátový typ.
- Alokácia môže zlyhať, ak pamäť nie je dostatočná. V takom prípade vráti ukazovateľ NULL. Mali by ste teda zahrnúť kód na kontrolu ukazovateľa NULL.
- Pamätajte, že pridelená pamäť je súvislá a dá sa s ňou zaobchádzať ako s poľom. Namiesto prístupu k zátvorkám [] môžeme na prístup k prvkom poľa použiť aritmetiku ukazovateľa. Odporúčame použiť + na označenie prvkov poľa, pretože pomocou prírastku ++ alebo + = sa zmení adresa uložená ukazovateľom.
Funkciu Malloc () je možné použiť aj so znakovým údajovým typom, ako aj so zložitými údajovými typmi, ako sú napríklad štruktúry.
Funkcia free ()
Pamäť premenných je automaticky pridelená v čase kompilácie. Pri dynamickom prideľovaní pamäte musíte prideliť pamäť výslovne. Ak to neurobíte, môžete sa stretnúť s chybou nedostatku pamäte.
Funkcia free () sa volá na uvoľnenie / uvoľnenie pamäte v C. Uvoľnením pamäte v programe sprístupníte ďalšie súbory na neskoršie použitie.
Napríklad:
#includeint main() {int* ptr = malloc(10 * sizeof(*ptr));if (ptr != NULL){*(ptr + 2) = 50;printf("Value of the 2nd integer is %d",*(ptr + 2));}free(ptr);}
Výkon
Value of the 2nd integer is 50
Funkcia C calloc ()
Funkcia C calloc () znamená súvislé prideľovanie. Táto funkcia sa používa na pridelenie viacerých blokov pamäte. Jedná sa o funkciu dynamického prideľovania pamäte, ktorá sa používa na pridelenie pamäte zložitým dátovým štruktúram, ako sú polia a štruktúry.
Funkcia Malloc () sa používa na pridelenie jedného bloku pamäťového priestoru, zatiaľ čo funkcia calloc () v jazyku C sa používa na pridelenie viacerých blokov pamäťového priestoru. Každý blok pridelený funkciou calloc () má rovnakú veľkosť.
Syntax funkcie calloc ():
ptr = (cast_type *) calloc (n, size);
- Vyššie uvedené vyhlásenie sa používa na pridelenie n pamäťových blokov rovnakej veľkosti.
- Po pridelení pamäťového priestoru sa všetky bajty inicializujú na nulu.
- Ukazovateľ, ktorý je momentálne na prvom bajte prideleného pamäťového priestoru, sa vráti.
Kedykoľvek dôjde k chybe pri prideľovaní pamäťového priestoru, ako je nedostatok pamäte, vráti sa nulový ukazovateľ.
Príklad calloc ():
Program uvedený nižšie počíta súčet aritmetickej postupnosti.
#includeint main() {int i, * ptr, sum = 0;ptr = calloc(10, sizeof(int));if (ptr == NULL) {printf("Error! memory not allocated.");exit(0);}printf("Building and calculating the sequence sum of the first 10 terms \ n ");for (i = 0; i < 10; ++i) { * (ptr + i) = i;sum += * (ptr + i);}printf("Sum = %d", sum);free(ptr);return 0;}
Výsledok:
Building and calculating the sequence sum of the first 10 termsSum = 45
calloc () vs. malloc (): kľúčové rozdiely
Nasleduje kľúčový rozdiel medzi malloc () Vs calloc () v C:
Funkcia calloc () je všeobecne vhodnejšia a efektívnejšia ako funkcia malloc (). Aj keď sa obe funkcie používajú na pridelenie pamäťového priestoru, funkcia calloc () môže alokovať viac blokov naraz. Nemusíte zakaždým vyžadovať blokovanie pamäte. Funkcia calloc () sa používa v zložitých dátových štruktúrach, ktoré vyžadujú väčší pamäťový priestor.
Pamäťový blok alokovaný pomocou calloc () v C je vždy inicializovaný na nulu, zatiaľ čo vo funkcii malloc () v C obsahuje vždy smetnú hodnotu.
Funkcia C realloc ()
Pomocou funkcie C realloc () môžete do už pridelenej pamäte pridať väčšiu veľkosť pamäte. Rozšíri aktuálny blok a ponechá pôvodný obsah tak, ako je. realloc () v C znamená realokácia pamäte.
Realloc () možno tiež použiť na zmenšenie veľkosti predtým pridelenej pamäte.
Syntax funkcie realloc ():
ptr = realloc (ptr,newsize);
Vyššie uvedené vyhlásenie alokuje nový pamäťový priestor so zadanou veľkosťou v premennej newsize. Po vykonaní funkcie sa ukazovateľ vráti na prvý bajt pamäťového bloku. Nová veľkosť môže byť väčšia alebo menšia ako predchádzajúca pamäť. Nemôžeme si byť istí, že ak novo pridelený blok bude smerovať na rovnaké miesto ako predchádzajúci pamäťový blok. Táto funkcia skopíruje všetky predchádzajúce údaje do novej oblasti. Zaisťuje, že údaje zostanú v bezpečí.
Príklad realoc ():
#includeint main () {char *ptr;ptr = (char *) malloc(10);strcpy(ptr, "Programming");printf(" %s, Address = %u\n", ptr, ptr);ptr = (char *) realloc(ptr, 20); //ptr is reallocated with new sizestrcat(ptr, " In 'C'");printf(" %s, Address = %u\n", ptr, ptr);free(ptr);return 0;}
Kedykoľvek má funkcia realloc () v C za následok neúspešnú operáciu, vráti nulový ukazovateľ a predchádzajúce údaje sa tiež uvoľnia.
Dynamické polia v C.
Dynamické pole v C umožňuje rast počtu prvkov podľa potreby. C Dynamické pole je široko používané v algoritmoch počítačovej vedy.
V nasledujúcom programe sme vytvorili a zmenili veľkosť dynamického poľa v jazyku C
#includeint main() {int * arr_dynamic = NULL;int elements = 2, i;arr_dynamic = calloc(elements, sizeof(int)); //Array with 2 integer blocksfor (i = 0; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);elements = 4;arr_dynamic = realloc(arr_dynamic, elements * sizeof(int)); //reallocate 4 elementsprintf("After realloc\n");for (i = 2; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);free(arr_dynamic);}
Výsledok programu C Dynamic array na obrazovke:
arr_dynamic[0]=0arr_dynamic[1]=1After reallocarr_dynamic[0]=0arr_dynamic[1]=1arr_dynamic[2]=2arr_dynamic[3]=3
Zhrnutie
- Pamäť môžeme dynamicky spravovať vytváraním pamäťových blokov podľa potreby v halde
- Pri dynamickom prideľovaní pamäte C je pamäť alokovaná za behu programu.
- Dynamické prideľovanie pamäte umožňuje manipulovať s reťazcami a poľami, ktorých veľkosť je flexibilná a dá sa kedykoľvek zmeniť vo vašom programe.
- Vyžaduje sa, keď nemáte tušenie, koľko pamäte zaberie konkrétna štruktúra.
- Malloc () v C je funkcia dynamického prideľovania pamäte, ktorá predstavuje alokáciu pamäte, ktorá blokuje pamäť so špecifickou veľkosťou inicializovanou na smetnú hodnotu
- Calloc () v C je súvislá funkcia alokácie pamäte, ktorá alokuje viac pamäťových blokov naraz inicializovaných na 0
- Realloc () v jazyku C sa používa na nové pridelenie pamäte podľa zadanej veľkosti.
- Funkcia Free () sa používa na vyčistenie dynamicky alokovanej pamäte.