Oei, nu wordt het ingewikkeld... 
Een variabele wordt aangemaakt op het moment van declaratie. En de levensduur hangt af van de 'scope'.
Een globale variabele -buiten een functie gedeclareerd- blijft altijd bestaan, zolang het programma draait.
Een lokale variabele (binnen een functie gedeclareerd) bestaat totdat het 'blok' is afgelopen. Zo een variabele wordt aangemaakt op de stack van het proces (thread) dat de variabele aanmaakt.
Bijv :
code:
int GlobalVariable = 12; // Blijft altijd bestaan
void PrintHtml()
{
if( ... )
{ int LocalVariable = 10; // Alleen binnen het if-blok
...
}
}
LocalVariable kun je alleen gebruiken binnen het if-blok waar hij is gedeclareerd, en daarna is die weg (gerecycled).
De ruimte op de stack is beperkt, zeker in een klein machientje als de ESP. Hooguit een paar kilobyte, al kun je dat wel aanpassen.
De heap is een blok werk-geheugen waar je stukken uit kunt gebruiken dmv malloc(). Die blijft dan bestaan totdat je dat geheugen weer teruggeeft aan de heap dmv free(). Doorgaans gebruik je een pointer om dat geheugen te kunnen benaderen:
Bijv
code:
void PrintHtml()
{
if( ... )
{ char *pData = malloc(200);
sprintf(PData, " .. " .. );
..
free(pData);
}
}
Hier neem je een blok van 200 bytes van de heap die je via pData kunt gebruiken. De pointer pData is een lokale variable dus die is weg aan het eind van het if-blok. Voor die tijd moet je de free() aanroepen om het blok terug tegen aan de heap. Want anders wordt dat stuk nooit meer vrijgegeven, en heb je na een tijdje geen heap meer beschikbaar.
Meestal gebruik je die malloc() en free() niet direct. Maar die zitten wel vaak ingebouwd in library funkties. Bijv als je een String declareert dan wordt daar intern een pointer gebruikt en een stuk heap geheugen gereserveerd die je mbv de String funkties kunt gebruiken. De heap van een String wordt automatisch weer vrijgegeven zodra de String out-of-scope gaat, dwz aan het eind van de if-blok. Hiervoor is een 'destructor' funktie aan de String toegevoegd.
Je kunt zo een blok trouwens ook zonder if gebruiken. Dat doe ik soms wel eens om een locale scope te definiëren.
Bijv:
code:
void PrintHtml()
{
{ int LocalVariable = 10;
...
}
{ int LocalVariable = 10;
...
}
{ int LocalVariable = 10;
...
}
}
Hier wordt 3 keer een lokale variabele aangemaakt die telkens aan het eind van het blok (sluithaakje) weer verdwijnt. In het volgende blok kun je dan weer een nieuwe aanmaken, eventueel met dezelfde naam.