Potrebujeme ľubovoľné množstvo pamäte,
+---------+
| main() |
| int pr1 |
| +------------+
| | funkcia1() |
| | int pr2 |
| | +---------------------+
| | | funkcia2(int arg1) |
| | | float pr3 |
| | +---------------------+
| | |
| | +---------------------+
| | | funkcia3(int arg1) |
| | | float pr3 |
| | +---------------------+
| | |
| +------------+
| |
+--------+
void funkcia(int a) {
a = 2;
}
int main(){
int a = 1;
funkcia(a);
}
Keď dopredu nevieme koľko pamäte budeme potrebovať.
Napr. potrebujeme prečítať súbor po riadkoch
Pri statickej alokácii budeme vždy obmedzení max. veľkosťou riadku, alebo budeme veľmi plytvať.
Existuje jedna "kopa" počas celého behu programu.
Na konci ju (možno) zruší operačný systém.
malloc()
alebo calloc()
.free()
.Vyhradili sme si 100 bajtov pamäte a ich adresu sme uložili do premennej
mojapamat
.
void* mojapamat = malloc(100);
Smerník typu void*
je všeobecný smerník, ktorý nehovorí na aký typ
pamäte ukazuje.
free(mojapamat);
Každú vyhradenú pamäť musíme explicitne uvoľniť pomocou free
.
int* intpamat = (int*)mojapamat;
intpamat[10] = 1;
// Mam k dispozicii 20 miest typu int
int* intpamat = malloc(sizeof(int)* 20);
intpamat[10] = 1;
free(intpamat);
Prvé miesto:
int prvahodnota = *intpamat;
Tretie miesto:
int tretiahodnota = intpamat[2];
+-------------------+
Pamäť na kope | | | | | | | | | | |
+-------------------+
adresa: \#10 1 \#20
^
|
+---------------------------+
|
Pamäť na stacku |
|
názov premennej: poleznakov |
typ premennej: char* |
+--------------+ |
hodnota: | 10 | -----------+
+--------------+
adresa: \#100 \#108
char* poleznakov = (char*)calloc(1,100);
poleznakov[0] = 'a';
free(poleznakov);
realloc
char* poleznakov = (char*)calloc(1,100);
poleznakov[0] = 'a';
poleznakov = realloc(poleznakov,200);
poleznakov[150] = 'b';
free(poleznakov);
malloc
a free
.