Hukommelsesmodel i C-sprog

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

Dynamisk hukommelse

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.

Eksempel

#include <stdlib.h> #include <string.h> statisk int x ; /* 0 som standard, eksisterer hele tiden */ statisk int y = 45 ; /* 45, eksisterer hele tiden */ int cnt ( ugyldig ) { statisk int i = 0 ; /* statisk type, initialiseret til nul kun ved programstart, ikke alle funktionskald */ int j = -1 ; /* automatisk type, initialiseret hver gang funktionen kaldes -1*/ i ++ ; /* stiger med 1 i statisk hukommelse, hver gang funktionen kaldes */ j ++ ; /* øge lokal variabel med 1 */ returnere ( i + j ); /* ved det første opkald fra programstart vil funktionen returnere 1, ved det andet opkald 2, ... */ } int main ( ugyldig ) { char arr [ 50 ] = "Dette er et objekt med automatisk lagringsvarighed" ; /* har en automatisk type, eksisterer indtil hovedudgange, de indledende 45 elementer i arrayet initialiseres med elementerne i strengen med et afsluttende nul, resten er udefinerede */ char * line = "Simpel linje" ; /* automatisk type, eksisterer indtil hovedudgangen, linje initialiseret med pointer til konstant */ int y ; /* værdi er ikke defineret, eksisterer indtil hovedudgange */ int z = 10 ; /* værdien er defineret, eksisterer indtil hovedudgangen */ char * ptr ; /* pointerværdi er ikke defineret */ ptr = malloc ( 50 ); /* værdi ved pointer er ikke defineret, objekt for pointer eksisterer før kald gratis */ strcpy ( ptr , arr ); fri ( ptr ); returnere 0 ; }

Noter

  1. 1 2 3 4 5 ISO/IEC 9899:1999. 6.2.4 . Hentet 5. august 2011. Arkiveret fra originalen 15. august 2011.
  2. ISO/IEC 9899:1999 7.20.3 . Hentet 5. august 2011. Arkiveret fra originalen 15. august 2011.
  3. C Faq . Hentet 8. august 2011. Arkiveret fra originalen 11. august 2011.