Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

Muistin varaus

Muistin varaukset keosta (heap)

Ohjelma varaa käyttöönsä muistia, jossa muuttujat ja ohjelma voivat toimia. Muuttujille varattu muisti jakaantuu kahteen osaan, :

  1. pinoon (stack)

...

  1. kekoon (heap)

. Pinoon talletetaan paikalliset muuttujat sekä fuktiokutsujen funktiokutsujen parametrit ja funktioiden paluuosoitteet. Pinoa ohjaa pino-osoitin, joka näyttää pinon päällimmäiseen tietoon. Pino toimii automaattisesti, eikä ohjelmoitsija ohjelmoija ohjaa sitä ohjelman sisältä. Keko on toinen tietovarasto, johon säilötään yhteiset muuttujat sekä sieltä voidaan varata muistia dynaamisesti muutujien käyttöön. Ongelmana on se, että kaikki osoitukset kekoon täytyy tehdä osoitteiden avulla ja kaikki muisti on varattava ennen käyttöä. Lisäksi ohjelman on muistettava kaikki varauksensa, jottei muistia hukata. Käsiteltäessä pitkiä  merkkijonoja merkkijonoja tai tietueita, kannataa niille varata erikseen muistialueet keosta.

Anchor
staattinen
staattinen

Muistin varaus pinosta (stack)

...

Anchor
dynaaminen
dynaaminen

Muistin varaukset keosta (heap)

Otsikkotiedosto malloc.h sisältää muistin varaukseen eli allokointiin usbeita useita funktioita esim. seuraavat:    • 

  • alloc()

...

  • calloc()

...

  • malloc()

...

  • free()

Esimerkki 1

Code Block

int puskuri = (int*)malloc(10*sizeof(int)); // Varataan muistia 10 intille
//assert(puskuri != NULL);
if (puskuri == NULL)
{
    printf("Virhe varatessa muistia\n\n");
    exit(-1);
}

Esimerkki 2

Seuraavana on esimerkki malloc() Seuraavana on esimerkki _fmalloc allokointi-funktion käytöstä, joka varaa muistia toisesta 64 kb muistilohkosta.

Funktio varaa osoittimelle pTuotteet tilaa VuoronTiedot tietueen verran.:

Code Block

...


if ((pTuotteet = _fmalloc(1 * sizeof(struct VuoronTiedot))) == NULL)

...


{
    printf("Allokointivirhe!!!");

...


    exit(1);

...


}

Funktio varaa osoittimelle OsSiirtoVektori tilaa 100 merkkiä.:

Code Block

...


if (OsSiirtovektori = _fmalloc(100 * sizeof(char)) == NULL)

...


{
     printf("Allokointivirhe!!!");

...


     exit(1);

...


}