Search
Při programovaní pracujeme s děma typy paměti, statickou a dynamickou. Přidělení statické paměti řeší kompilátor a není nutné se o něj nijak starat. Nevýhodou takto přidělené paměti je poměrne nízká flexibilita. Jinými slovy veškeré paměťové nároky na statickou paměť musejí být známy již v čase překladu (před samotným během programu). Pokud ale nevíme určit jak veliká budou data s nimiž bude náš program pracovat začíná být použití statické paměti obtížné nebo minimálně nehospodárné, když alokujeme vždy paměť pro nejhorší(největší) možný případ.
Mnohem elegantnejší je použití dynamické alokace paměti (tam kde si to situace vyžaduje), která umožnuje alokovat místo v paměti přímo za běhu programu.
Správu dynamické paměti řeší tzv. run-time fukce, které pracují s pamětí za běhu programu. Ve skutečnosti se jedná o relativne složité operace silně závislé na architektuře a operačním systému. Programovací jazyk je ale zaobaluje do jednoduchých a univerzálních funkcí.
void *malloc(size_t bytes); void *calloc(size_t n, size_t bytes);
#include<stdlib.h> int *ui; /* vytvoreni dynamicke promenne */ if ((ui = (int *) malloc(sizeof(*ui))) == NULL) { /* zadost o prideleni pameti velikost typu int */ printf("Nedostatek pameti.\n"); return 1; /* případně pro ukonceni programu exit(1); */ }
Dynamicky vytvořené proměnné jednoduchých typů obvykle nejsou třeba. Užitečné je dynamicky vytvořené pole:
#include<stdlib.h> int n, *up; printf("Zadejte velikost pole: \n"); int r = scanf("%d", &n); if (r != 1 || (r == 1 && n < 0)) { fprintf(stderr, "Nepodarilo se nacist velikost pole.\n"); return 1; /* případně pro ukonceni programu exit(1); */ } /* dynamicka alokace pameti pro jednorozmerne pole */ if ((up = (int *) malloc(n * sizeof (*up))) == NULL) { /* zadost o prideleni pameti */ fprintf(stderr, "Nedostatek pameti.\n"); return 1; /* případně pro ukonceni programu exit(1); */ }
void free(void *aptr);
#include<stdlib.h> /* uvolneni pameti vyse alokovaneho prostoru pro jednorozmerne pole */ free(up); up = NULL;
void *realloc(void *aptr, size_t bytes);
#include<stdlib.h> int n, *up, *unovep; printf("Zadejte velikost pole: \n"); int r = scanf("%d", &n); if (r != 1 || (r == 1 && n < 0)) { fprintf(stderr, "Nepodarilo se nacist velikost pole.\n"); return 1; /* případně pro ukonceni programu exit(1); */ } /* dynamicka alokace pameti pro jednorozmerne pole */ if ((up = (int *) malloc(n * sizeof (*up))) == NULL) { /* zadost o prideleni pameti */ printf("Nedostatek pameti.\n"); return 1; /* případně pro ukonceni programu exit(1); */ } printf("Zadejte novou velikost pole: \n"); scanf("%d", &n); /* realokace vyse alokovane pameti */ if ((unovep = (int *) realloc(up, n * sizeof (*unovep))) == NULL) { printf("Nedostatek pameti.\n"); return 1; /* případně pro ukonceni programu exit(1); */ }
Proč by byla chyba použít níže uvedenou konstrukci?
((up = (int *) realloc(up, n * sizeof (*up))) == NULL)