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] .
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.