V tomto kurzu se naučíte dynamicky přidělovat paměť ve vašem programu C pomocí standardních knihovních funkcí: malloc (), calloc (), free () a realloc ().
Jak víte, pole je kolekce pevného počtu hodnot. Jakmile je deklarována velikost pole, nemůžete ji změnit.
Někdy může být velikost deklarovaného pole nedostatečná. Chcete-li tento problém vyřešit, můžete během běhu přidělit paměť ručně. Toto se v programování C nazývá dynamické přidělování paměti.
Alokovat dynamickou pamětí, knihovna funkce jsou malloc()
, calloc()
, realloc()
a free()
jsou používány. Tyto funkce jsou definovány v hlavičkovém souboru.
C malloc ()
Název „malloc“ znamená alokaci paměti.
malloc()
Funkce vyhrazuje blok paměti zadaného počtu bajtů. A vrací ukazatel, void
který lze vložit do ukazatelů jakékoli formy.
Syntaxe malloc ()
ptr = (castType*) malloc(size);
Příklad
ptr = (float*) malloc(100 * sizeof(float));
Výše uvedený příkaz přiděluje 400 bajtů paměti. Je to proto, že velikost float
je 4 bajty. Ukazatel ptr drží adresu prvního bajtu v přidělené paměti.
Výsledkem výrazu je NULL
ukazatel, pokud nelze alokovat paměť.
C calloc ()
Název „calloc“ znamená souvislou alokaci.
malloc()
Paměťové funkce přiděluje a listy paměť neinicializované. Zatímco calloc()
funkce přiděluje paměť a inicializuje všechny bity na nulu.
Syntaxe calloc ()
ptr = (castType*)calloc(n, size);
Příklad:
ptr = (float*) calloc(25, sizeof(float));
Výše uvedený příkaz přiděluje souvislý prostor v paměti pro 25 prvků typu float
.
C zdarma ()
Dynamicky přidělená paměť vytvořená buďto, calloc()
nebo malloc()
se sama neuvolní. Musíte explicitně použít free()
k uvolnění prostoru.
Syntaxe free ()
free(ptr);
Tento příkaz uvolní místo přidělené v paměti, na kterou ukazuje ptr
.
Příklad 1: malloc () a free ()
// Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) malloc(n * sizeof(int)); // if memory cannot be allocated if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); // deallocating the memory free(ptr); return 0; )
Zde jsme dynamicky přidělili paměť pro n počet int
.
Příklad 2: calloc () a free ()
// Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) calloc(n, sizeof(int)); if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); free(ptr); return 0; )
C realloc ()
Pokud je dynamicky přidělená paměť nedostatečná nebo větší, než je požadováno, můžete pomocí realloc()
funkce změnit velikost dříve přidělené paměti .
Syntaxe realloc ()
ptr = realloc(ptr, x);
Zde je ptr přerozděleno s novou velikostí x.
Příklad 3: realloc ()
#include #include int main() ( int *ptr, i , n1, n2; printf("Enter size: "); scanf("%d", &n1); ptr = (int*) malloc(n1 * sizeof(int)); printf("Addresses of previously allocated memory: "); for(i = 0; i < n1; ++i) printf("%u",ptr + i); printf("Enter the new size: "); scanf("%d", &n2); // rellocating the memory ptr = realloc(ptr, n2 * sizeof(int)); printf("Addresses of newly allocated memory: "); for(i = 0; i < n2; ++i) printf("%u", ptr + i); free(ptr); return 0; )
Když spustíte program, výstup bude:
Zadejte velikost: 2 Adresy dříve přidělené paměti: 26855472 26855476 Zadejte novou velikost: 4 Adresy nově přidělené paměti: 26855472 26855476 26855480 26855484