Dynamická alokace paměti v C: funkce malloc (), calloc ()

Obsah:

Anonim

Než se naučíte přidělení dynamické paměti C, pochopíme:

Jak funguje správa paměti v jazyce C?

Když deklarujete proměnnou pomocí základního datového typu, kompilátor C automaticky přidělí paměťový prostor pro proměnnou ve fondu paměti, který se nazývá zásobník .

Plovoucí proměnná například při deklaraci trvá obvykle 4 bajty (podle platformy). Tyto informace můžeme ověřit pomocí operátoru sizeof , jak je znázorněno v následujícím příkladu

#include int 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 

Také pole se zadanou velikostí je přiděleno v souvislých blocích paměti, každý blok má velikost pro jeden prvek:

#include int main() { float arr[10];printf("The size of the float array with 10 element is %d", sizeof(arr)); return 0;} 

Výsledek je:

 The size of the float array with 10 element is 40

Jak jsme se zatím dozvěděli, při deklaraci základního datového typu nebo pole se paměť automaticky spravuje. Existuje však proces přidělování paměti v jazyce C, který vám umožní implementovat program, ve kterém je velikost pole nerozhodnutá, dokud nespustíte svůj program (běhový modul). Tento proces se nazývá „ Dynamické přidělování paměti “.

V tomto výukovém programu se naučíte

  • Jak funguje správa paměti v jazyce C?
  • Dynamická alokace paměti v C.
  • Funkce C malloc ()
  • Funkce free ()
  • Funkce C calloc ()
  • calloc () vs. malloc (): Klíčové rozdíly
  • Funkce C realloc ()
  • Dynamická pole

Dynamická alokace paměti v C.

Dynamické přidělování paměti je ruční přidělování a uvolňování paměti podle vašich programovacích potřeb. Dynamická paměť se spravuje a obsluhuje ukazateli, které ukazují na nově přidělený paměťový prostor v oblasti, kterou nazýváme halda.

Nyní můžete bez problémů dynamicky vytvářet a ničit řadu prvků za běhu. Stručně řečeno, automatická správa paměti používá zásobník a C Dynamic Memory Allocation používá haldu.

Knihovna má funkce zodpovědné za správu dynamické paměti.

Funkce Účel
malloc () Přidělí paměť požadované velikosti a vrátí ukazatel na první bajt přiděleného prostoru.
calloc () Přiděluje prostor pro prvky pole. Inicializuje prvky na nulu a vrátí ukazatel do paměti.Initializes the elements to zero and returns a pointer to the memory.
realloc () Slouží k úpravě velikosti dříve přiděleného paměťového prostoru.
Volný, uvolnit() Uvolní nebo vyprázdní dříve přidělené místo v paměti.

Pojďme diskutovat o výše uvedených funkcích s jejich aplikací

Funkce C malloc ()

Funkce C malloc () znamená alokaci paměti. Jedná se o funkci, která se používá k dynamickému přidělení bloku paměti. Vyhrazuje si paměťový prostor zadané velikosti a vrací nulový ukazatel ukazující na paměťové místo. Vrácený ukazatel je obvykle typu void. To znamená, že můžeme funkci C malloc () přiřadit libovolnému ukazateli.

Syntaxe funkce malloc ():

ptr = (cast_type *) malloc (byte_size);

Tady,

  • ptr je ukazatel cast_type.
  • Funkce C malloc () vrací ukazatel na alokovanou paměť byte_size.

Příklad malloc ():

Example: ptr = (int *) malloc (50)

Když je tento příkaz úspěšně proveden, je rezervován paměťový prostor 50 bajtů. Adresa prvního bajtu vyhrazeného prostoru je přiřazena ukazateli ptr typu int.

Zvažte další příklad:

#include int 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ýstup:

Value of the 6th integer is 480

  1. Všimněte si, že místo sizeof (int ) byl použit sizeof (* ptr), aby byl kód robustnější, když se * ptr deklarace později vysílá na jiný datový typ.
  2. Alokace může selhat, pokud paměť není dostatečná. V tomto případě vrátí ukazatel NULL. Měli byste tedy zahrnout kód pro kontrolu ukazatele NULL.
  3. Mějte na paměti, že přidělená paměť je souvislá a lze ji považovat za pole. Můžeme použít aritmetiku ukazatele pro přístup k prvkům pole spíše než pomocí závorek []. Doporučujeme použít + k označení prvků pole, protože pomocí přírůstku ++ nebo + = se změní adresa uložená ukazatelem.

Funkci Malloc () lze také použít se znakovým datovým typem i se složitými datovými typy, jako jsou struktury.

Funkce free ()

Paměť proměnných je automaticky uvolněna v době kompilace. Při dynamickém přidělování paměti musíte explicitně uvolnit paměť. Pokud tak neučiníte, může dojít k chybě paměti.

Funkce free () se volá k uvolnění / uvolnění paměti v C. Uvolněním paměti ve vašem programu zpřístupníte více pro pozdější použití.

Například:

#include int 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ýstup

 Value of the 2nd integer is 50

Funkce C calloc ()

Funkce C calloc () znamená souvislou alokaci. Tato funkce se používá k přidělení více bloků paměti. Jedná se o funkci dynamické alokace paměti, která se používá k přidělení paměti složitým datovým strukturám, jako jsou pole a struktury.

Funkce Malloc () se používá k přidělení jednoho bloku paměťového prostoru, zatímco funkce calloc () v C se používá k přidělení více bloků paměťového prostoru. Každý blok alokovaný funkcí calloc () má stejnou velikost.

Syntaxe funkce calloc ():

ptr = (cast_type *) calloc (n, size);
  • Výše uvedený příkaz se používá k přidělení n paměťových bloků stejné velikosti.
  • Po přidělení paměťového prostoru se všechny bajty inicializují na nulu.
  • Je vrácen ukazatel, který je aktuálně na prvním bajtu přiděleného paměťového prostoru.

Kdykoli dojde k chybě při přidělování paměťového prostoru, jako je nedostatek paměti, vrátí se nulový ukazatel.

Příklad calloc ():

Níže uvedený program vypočítá součet aritmetické sekvence.

#include int 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ýsledek:

Building and calculating the sequence sum of the first 10 termsSum = 45

calloc () vs. malloc (): Klíčové rozdíly

Následuje klíčový rozdíl mezi malloc () Vs calloc () v C:

Funkce calloc () je obecně vhodnější a efektivnější než funkce malloc (). Zatímco obě funkce se používají k přidělení paměťového prostoru, calloc () může přidělit více bloků najednou. Nemusíte pokaždé požadovat blok paměti. Funkce calloc () se používá ve složitých datových strukturách, které vyžadují větší paměťový prostor.

Paměťový blok alokovaný pomocí calloc () v C je vždy inicializován na nulu, zatímco ve funkci malloc () v C vždy obsahuje nesmyslnou hodnotu.

Funkce C realloc ()

Pomocí funkce C realloc () můžete přidat další velikost paměti do již přidělené paměti. Rozbalí aktuální blok a ponechá původní obsah tak, jak je. realloc () v C znamená přerozdělení paměti.

realloc () lze také použít ke zmenšení velikosti dříve přidělené paměti.

Syntaxe funkce realloc ():

ptr = realloc (ptr,newsize);

Výše uvedený příkaz přiděluje nový prostor paměti se zadanou velikostí v proměnné newsize. Po provedení funkce bude ukazatel vrácen na první bajt paměťového bloku. Nová velikost může být větší nebo menší než předchozí paměť. Nemůžeme si být jisti, že pokud nově přidělený blok bude ukazovat na stejné místo jako předchozí blok paměti. Tato funkce zkopíruje všechna předchozí data v nové oblasti. Zajišťuje, že data zůstanou v bezpečí.

Příklad realloc ():

#include int 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;} 

Kdykoli má realloc () v C za následek neúspěšnou operaci, vrátí nulový ukazatel a předchozí data se také uvolní.

Dynamická pole v C.

Dynamic array in C allows the number of elements to grow as needed. C Dynamické pole je široce používáno v algoritmech počítačové vědy.

V následujícím programu jsme vytvořili a změnili velikost dynamického pole v jazyce C.

#include int 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ýsledek programu C Dynamic array na obrazovce:

arr_dynamic[0]=0arr_dynamic[1]=1After reallocarr_dynamic[0]=0arr_dynamic[1]=1arr_dynamic[2]=2arr_dynamic[3]=3

souhrn

  • Můžeme dynamicky spravovat paměť vytvořením paměťových bloků podle potřeby v haldě
  • V C Dynamic Memory Allocation je paměť alokována za běhu.
  • Dynamické přidělování paměti umožňuje manipulovat s řetězci a poli, jejichž velikost je flexibilní a lze je kdykoli v programu změnit.
  • Je vyžadováno, pokud nemáte tušení, kolik paměti konkrétní struktura zabírá.
  • Malloc () v C je funkce dynamické alokace paměti, která znamená alokaci paměti, která blokuje paměť se specifickou velikostí inicializovanou na hodnotu smetí
  • Calloc () v C je souvislá funkce přidělení paměti, která přiděluje více paměťových bloků v době inicializované na 0
  • Realloc () v C se používá k přerozdělení paměti podle zadané velikosti.
  • Funkce Free () slouží k vymazání dynamicky přidělené paměti.