Minnesmodell i C-språk

Minnesmodellen i C-språket  är ett system för att lagra objekt i C- språket [1] .

Sättet som ett objekt lagras i C definierar dess livslängd, den del av programexekveringstiden under vilken objektet existerar eller utrymme är reserverat för det. Objektet har en permanent adress och behåller sitt sista värde. Det är förbjudet att komma åt ett objekt som har upphört att existera, medan om en pekare användes när man arbetade med ett objekt förblir dess värde odefinierat.

Det finns tre sätt att lagra objekt [1] : automatisk, statisk och dynamisk .

Fast egendom Bil Statisk Dynamisk
Ad Objekt utan bindning och utanstatic Har intern eller extern bindning, eller deklareras med ett kvalstatic Markerad medmalloc
Tillvarotid Blocket där objektet deklareras Hela tiden programmet körs Från samtal malloctill samtalfree
Initialisering Saknas om det inte finns någon explicit initiering Uppstår en gång innan programmet startar. Delvis i fallcalloc
Storleken Fast, oföränderlig Fast, oföränderlig Alla, föränderliga
Typisk placering Stack- eller processorregister Separat minnessegment högen

Ett statiskt objekt kan initieras explicit, eller standardinitiering kan användas.

När du använder funktionen är callocalla objekt null förutom flyttalsnummer och pekare [2] .

Icke-lvalue - uttryck som hänvisar till en matris som är medlem i en struktur ( struct) eller union ( union) har en livslängd begränsad av utvärderingen av det uttrycket [1] .

C-strängar som initierar pekare char*har en statisk lagringstyp och bör inte ändras [3] .

Dynamiskt minne

Inget objekt kan finnas i dynamiskt minne utan explicita instruktioner från programmeraren. För att arbeta med dynamiskt minne finns funktionerna malloc, callococh . Eftersom funktioner som allokerar minne har en storlek i en variabel av typen , är den maximala mängden minne som allokeras begränsad [1] . reallocfreesize_tSIZE_T_MAX

Funktionerna mallococh callocallokerar minne, som efter användning måste frigöras med ett anrop till free. När pekaren har frigjorts förblir värdet odefinierat . Funktionen reallocreturnerar en pekare till det modifierade minnesblocket, om begäran inte kan uppfyllas ändras inte storleken på minnesblocket [1] .

#include <stdlib.h> void foo ( void ** ptr , size_t size ) { * ptr = realloc ( * ptr , storlek + 128 ); /* minnesläcka om realloc returnerar NULL */ om ( !* ptr ) { ... } }

Vid arbete med dynamiskt minne är minnesläckor och dubbelblockfria fel möjliga.

Exempel

#include <stdlib.h> #include <string.h> statisk int x ; /* 0 som standard, finns hela tiden */ statisk int y = 45 ; /* 45, finns hela tiden */ int cnt ( void ) { statisk int i = 0 ; /* statisk typ, initialiserad till noll endast vid programstart, inte varje funktionsanrop */ int j = -1 ; /* automatisk typ, initieras varje gång funktionen kallas -1*/ i ++ ; /* ökar med 1 i statiskt minne varje gång funktionen anropas */ j ++ ; /* öka lokal variabel med 1 */ return ( i + j ); /* vid det första anropet från programstart kommer funktionen att returnera 1, vid det andra anropet 2, ... */ } int main ( void ) { char arr [ 50 ] = "Detta är ett objekt med automatisk lagringstid" ; /* har en automatisk typ, existerar tills huvudutgångar, de initiala 45 elementen i arrayen initieras med elementen i strängen med en avslutande nolla, resten är odefinierade */ char * line = "Enkel linje" ; /* automatisk typ, existerar tills huvudutgången går ut, raden initialiserad med pekaren till konstant */ int y ; /*-värdet är inte definierat, existerar tills huvudutgången */ int z = 10 ; /*-värdet är definierat, existerar tills huvudutgången går */ char * ptr ; /* pekarvärde är inte definierat */ ptr = malloc ( 50 ); /* värde för pekare är inte definierat, objekt för pekare finns innan anropet ledigt */ strcpy ( ptr , arr ); fri ( ptr ); returnera 0 ; }

Anteckningar

  1. 1 2 3 4 5 ISO/IEC 9899:1999. 6.2.4 . Hämtad 5 augusti 2011. Arkiverad från originalet 15 augusti 2011.
  2. ISO/IEC 9899:1999 7.20.3 . Hämtad 5 augusti 2011. Arkiverad från originalet 15 augusti 2011.
  3. C Vanliga frågor . Hämtad 8 augusti 2011. Arkiverad från originalet 11 augusti 2011.