Kupując komputer zawsze myślimy o pamięci: im więcej tym lepiej. Nie zastanawiamy się jak jest zorganizowana.
Stos (ang: stack) to liniowa struktura pamięci, w której dane dodawane są na wierzch stosu i są z niego pobierane.
Sterta (czasami określana jako kopiec lub stóg, ang. heap) to obszar pamięci służący do implementacji dynamicznie tworzonych struktur danych.
Za każdym razem gdy użyjemy konstrukcji typu:
{
int a;
}
tworzona jest zmienna (a
w tym przypadku) , a pamięć przydzielana jest na stosie. Każdy proces ma swój własny stos o ograniczonej wielkości. Po wyjściu z bloku pamięć jest zwalniana.
Poniższy program pozwala „zbadać” (w przybliżeniu) wielkość stosu:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
for ( long int i = 1; ; i = i * 2 )
{
printf("i=%ld\n", i);
char t[i];
t[i - 1] = 0.;
}
return 0;
}
Program kończy pracę wypisując ostatnią wartość i = 8388608
czyli około 8 Mbajtów.
Polecenie powłoki ulimit -s
podaje (w kilobajtach) dokładną wartość:
$ ulimit -s
8192
W konsekwencji ilość pamięci na dane jest ograniczona. Wielkość tej pamięci można zmienić. Polecenie powłoki ulimit
pozwala tę wartość zmienić.
$ ulimit -s 20000
$ ulimit -s
20000
# sprawdźmy teraz nasz program
./tablica-stos
...
i=33554432
Zatem ilość dostępnej pamięci na stosie się zwiększyła…
Poniższy program korzysta z funkcji malloc()
:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
for ( long int i = 1; ; i = i * 2 )
{
double * t = malloc(sizeof( double ) * i);
if ( t == NULL )
{
printf("brak pamieci, i=%ld\n", i);
return 1;
}
t[i - 1] = 0.;
free(t);
}
return 0;
}
Po uruchomieniu wynik jest następujacy:
brak pamieci, i=2147483648