Memória modell C nyelven

A C nyelvű memóriamodell a C nyelvű objektumok  tárolására szolgáló rendszer [1] .

Az objektum C-ben való tárolásának módja határozza meg az élettartamát, a programvégrehajtási időnek azt a részét, amely alatt az objektum létezik vagy helyet foglalnak le számára. Az objektum állandó címmel rendelkezik , és megőrzi utolsó értékét. Megszűnt objektumhoz tilos hozzáférni, míg ha egy tárggyal végzett munka során mutatót használtak, annak értéke definiálatlan marad.

Az objektumok tárolásának három módja van [1] : automatikus, statikus és dinamikus .

Ingatlan Auto Statikus Dinamikus
Hirdetés Tárgy kötés nélkül és anélkülstatic Belső vagy külső kötéssel rendelkezik, vagy minősítővel van deklarálvastatic Kiemelve:malloc
A létezés ideje Az a blokk, amelyben az objektum deklarálva van A program folyamatosan fut Hívásról mallochívásrafree
Inicializálás Hiányzik, ha nincs kifejezett inicializálás A program indulása előtt egyszer fordul elő. Részben abban az esetbencalloc
A méret Rögzített, megváltoztathatatlan Rögzített, megváltoztathatatlan Bármilyen, változtatható
Tipikus elhelyezés Verem vagy processzor regiszterek Külön memória szegmens halom

Egy statikus objektum explicit módon inicializálható, vagy alapértelmezett inicializálás használható.

A függvény használatakor callocminden objektum nulla, kivéve a lebegőpontos számokat és a mutatókat [2] .

Azok a nem értékértékű kifejezések , amelyek egy struktúra ( struct) vagy unió ( ) tagjaként működő tömbre hivatkoznak, unionélettartamukat a kifejezés kiértékelése korlátozza [1] .

A mutatókat inicializáló C-karakterláncok char*statikus tárolási típussal rendelkeznek, ezért nem szabad megváltoztatni [3] .

Dinamikus memória

Egyetlen objektum sem lehet a dinamikus memóriában a programozó kifejezett utasítása nélkül. mallocA dinamikus memória használatához a , callocés a függvények állnak reallocrendelkezésre free. Mivel a memóriát lefoglaló függvények mérete egy típusú változóban van size_t, a lefoglalt memória maximális mennyisége korlátozott SIZE_T_MAX[1] .

A mallocés függvények callocmemóriát foglalnak le, amelyet használat után a szám hívásával kell felszabadítani free. A felszabadítás után a mutató értéke meghatározatlan marad . A függvény reallocmutatót ad vissza a módosított memóriablokkra, ha a kérés nem teljesíthető, a memóriablokk mérete nem változik [1] .

#include <stdlib.h> void foo ( érvénytelen ** ptr , size_t méret ) { * ptr = realloc ( * ptr , méret + 128 ); /* memóriaszivárgás, ha a realloc NULL értéket ad vissza */ if ( !* ptr ) { ... } }

Ha dinamikus memóriával dolgozik, memóriaszivárgás és dupla blokkmentes hibák lehetségesek.

Példa

#include <stdlib.h> #include <karakterlánc.h> statikus int x ; /* alapértelmezés szerint 0, mindig létezik */ statikus int y = 45 ; /* 45, állandóan létezik */ int cnt ( érvénytelen ) { statikus int i = 0 ; /* statikus típus, csak a program indításakor inicializálódik nullára , nem minden függvényhívás */ int j = -1 ; /* automatikus típus, a függvény minden egyes meghívásakor inicializálódik -1*/ i ++ ; /* 1-gyel növeli a statikus memóriát a függvény minden egyes meghívásakor */ j ++ ; /* a helyi változó növelése 1-gyel */ return ( i + j ); /* a programindítás első hívásánál a függvény 1-et ad vissza, a második hívásnál 2-t, ... */ } int main ( érvénytelen ) { char arr [ 50 ] = "Ez egy automatikus tárolási időtartamú objektum" ; /* automatikus típusú, fő kilépésig létezik, a tömb kezdeti 45 eleme a string elemeivel inicializálva van záró nullával, a többi definiálatlan */ char * line = "Egyszerű sor" ; /* automatikus típus, a fő kilépésig létezik , a sor inicializálva a mutatót állandóra */ int y ; /* érték nincs megadva, a fő kilépésig létezik */ int z = 10 ; /* érték definiálva, a fő kilépésig létezik */ char * ptr ; /* a mutató értéke nincs megadva */ ptr = malloc ( 50 ); /* mutatónkénti érték nincs megadva, az objektum mutatónként létezik a free meghívása előtt */ strcpy ( ptr , arr ); ingyenes ( ptr ); return 0 ; }

Jegyzetek

  1. 1 2 3 4 5 ISO/IEC 9899:1999. 6.2.4 . Letöltve: 2011. augusztus 5. Az eredetiből archiválva : 2011. augusztus 15..
  2. ISO/IEC 9899:1999 7.20.3 . Letöltve: 2011. augusztus 5. Az eredetiből archiválva : 2011. augusztus 15..
  3. C GYIK . Letöltve: 2011. augusztus 8. Az eredetiből archiválva : 2011. augusztus 11..