Kihagyás

5. előadás

Memóriakezelés

Hierarchikus felépítés (RAM, cache, registerek)

Gyorsítótárak (Cache)

Processzorokban található típikusan. Memória írása, olvasásakor használatos.

SOKKAL gyorsabb elérésű, mint a RAM, de kevesebb.

Programok futása

Address space (címtér): a program számára elérhetőmemória.

Ha egy program kilép ebből az address space-ből, akkor az operációs rendszer közbelép és leállítja a programot. (segfault c:)

C programok címtere

  • text: programkód, read-only
  • intialized data: globális és statikus változók. Van read-only és read-write része is
  • uninitialized data: változók tárolására szolgáló memória
  • heap: malloc-al allokálható.
  • stack: függvények számára elérhető memória
  • command line argumentumok

Ha elfogy a memória, használható virtuális memória

Pointerek

Olyan típus, amely egy változó memóriacímét tárolja

Cím operátor

Változóra alkalmazva, megadja annak a tárcímét, tehát a rá mutató mutatót

int a = 4;
int* a_pointer = &a;

Indirekció operátor

Pointerre alkalmazva, a pointer által mutatott tárterületet jelöli

*a_pointer += 1; // a = 5;
int b = *a_pointer; // b = 5;

Null pointer

Egyetlen változó címének sem felel meg If you dereference it, you die.

Műveletek pointerekkel

Pointer változóknak értékül adhatunk ugyanolyan típusú pointer értékeket.

Két pointer értékét össze lehet hasonlítani == és != operátorokkal. Két pointer akkor egyenlő, ha ugyan oda mutatnak.

Ha a két pointer ugyan annak a tömbnek az elemeira mutatnak, akkor értelmezhetőek a relációs (pl <, >= stb.) operátorok is. Ekkor a tömb indexeket hasonlítjuk össze.

A művelet lehetséges tömbön kívül is, azonban ez nem várt viselkedéshez vezethet!

Pointer aritmetika

double t[] = {1.0, 2.0, 3.0, 4.0};
double *dp;

dp = t;

assert(dp+1 == &t[1]);
assert(dp+3 == &t[3]);

assert(  dp+k  == &t[k]);
assert(*(dp+k) ==  t[k]);

Tömbök

double dt[5];

int it2[6] = {1,2,3,4,5,6};
int it3[] = {7,8,9};

char h1[] = "hello"; //Mérete: 6
char h2[] = {'h', 'e', 'l', 'l', 'o', '\0'};

Pointerek és tömbök kapcsolata

double t[] = {1.0, 2.0, 3.0};
double *dp;

dp = &t[0];

assert(t == &t[0]);
assert(dp[1] == t[1]);