Hukommelsesmodellen i C-sproget er et system til lagring af objekter i C -sproget [1] .
Den måde et objekt er gemt i C definerer dets levetid, den del af programmets udførelsestid, hvor objektet eksisterer, eller plads er reserveret til det. Objektet har en permanent adresse og bevarer sin sidste værdi. Det er forbudt at få adgang til et objekt, der er ophørt med at eksistere, mens hvis en pointer blev brugt, når du arbejdede med et objekt, forbliver dets værdi udefineret.
Der er tre måder at gemme objekter på [1] : automatisk, statisk og dynamisk .
Ejendom | Auto | Statisk | Dynamisk |
---|---|---|---|
Ad | Genstand uden binding og udenstatic | Har intern eller ekstern binding, eller er erklæret med en qualifierstatic | Fremhævet medmalloc |
Tilværelsens tid | Blokken, hvor objektet er erklæret | Hele tiden programmet kører | Fra opkald malloctil opkaldfree |
Initialisering | Mangler, hvis der ikke er nogen eksplicit initialisering | Forekommer én gang før programmet starter. | Delvist i tilfældecalloc |
Størrelsen | Fast, uforanderlig | Fast, uforanderlig | Enhver, foranderlig |
Typisk placering | Stak- eller processorregistre | Separat hukommelsessegment | dynge |
Et statisk objekt kan initialiseres eksplicit, eller standardinitialisering kan bruges.
Ved brug af funktionen er callocalle objekter null undtagen flydende kommatal og pointere [2] .
Ikke -lværdi- udtryk, der refererer til en matrix, der er medlem af en struktur ( struct) eller union ( union), har en levetid, der er begrænset af evalueringen af dette udtryk [1] .
C-strenge, der initialiserer pointere, char*har en statisk lagertype og bør ikke ændres [3] .
Intet objekt kan være i dynamisk hukommelse uden eksplicitte instruktioner fra programmøren. For at arbejde med dynamisk hukommelse er der funktioner malloc, calloc, reallocog free. Da funktioner, der allokerer hukommelse, har en størrelse i en variabel af typen size_t, er den maksimale mængde hukommelse, der allokeres, begrænset SIZE_T_MAX[1] .
Funktionerne mallocog calloctildeler hukommelse, som efter brug skal frigøres ved et opkald til free. Når den er frigivet, forbliver værdien af markøren udefineret . Funktionen reallocreturnerer en pointer til den ændrede hukommelsesblok, hvis anmodningen ikke kan opfyldes, ændres størrelsen af hukommelsesblokken ikke [1] .
#include <stdlib.h> void foo ( void ** ptr , size_t size ) { * ptr = realloc ( * ptr , størrelse + 128 ); /* hukommelseslæk, hvis realloc returnerer NULL */ hvis ( !* ptr ) { ... } }Når du arbejder med dynamisk hukommelse, er hukommelseslækager og dobbeltblokfri fejl mulige.