Malloc og Free
Disse funktioner gør det muligt at oprette nye objekter ikke under kompilering, men under programudførelse, hvilket giver mulighed for dynamisk hukommelsesallokering.
malloc()
Tidligere, for at allokere hukommelse til vores data, ville vi blot erklære:
int x;
Nu kan vi med funktionen malloc() allokere hukommelse dynamisk:
int* pX = (int*)malloc(4);
Funktionen malloc() kræver antallet af bytes, der skal allokeres, som argument. Hvis du ikke kender det nødvendige antal bytes, men kender datatypen, kan du justere udtrykket således:
int* pX = (int*)malloc(sizeof(int));
Hvad sker der nu?
Bemærk, at vi tildeler resultatet af funktionen malloc() til en pointer. Det betyder, at malloc() returnerer en adresse!
Præfikset (int*) er en eksplicit typekonvertering. Vi angiver manuelt den ønskede type. For eksempel:
double x = 3.14;
int y = (int)x; // `y` = 3
Main.c
1234567891011#include <stdio.h> #include <stdlib.h> // new header file! int main() { int* pX = (int*)malloc(sizeof(int)); printf("Address of allocated memory: %p\n", pX); return 0; }
Bemærk
Husk at inkludere header-filen
stdlib.h. Den indeholder prototypen for funktionenmalloc().
For at gemme data på adressen, der leveres af funktionen malloc(), anvendes dereference-operatoren.
Main.c
123456789101112#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); return 0; }
Er det muligt at frigøre hukommelse? – Ja, men kun den hukommelse, der er allokeret med malloc() og lignende funktioner.
free()
Denne funktion anvendes sammen med pointere. For at illustrere dette, lad os udvide eksemplet ovenfor:
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); free(pX); printf("After `free()` value %d at address %p\n", *pX, pX); return 0; }
Interessant nok forbliver en pointer funktionel, selv efter at vi "sletter" den, men værdien, der er gemt i dens tilknyttede hukommelsesplacering, bliver forvrænget.
Dette fører til et problem: en optaget hukommelsescelle indeholder nu upålidelige data. For at undgå disse pointere bør den anvendte pointer nulstilles til NULL.
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf("Value %d at address %p\n", *pX, pX); free(pX); pX = NULL; return 0; }
At sætte en pointer til NULL efter frigivelse af dens hukommelse er en tydelig måde at indikere, at pointeren ikke længere refererer til en gyldig hukommelsesplacering.
Kontroller altid, om pointeren er NULL, før den bruges, for at sikre, at du ikke tilgår ugyldig eller allerede allokeret hukommelse.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Awesome!
Completion rate improved to 2.63
Malloc og Free
Stryg for at vise menuen
Disse funktioner gør det muligt at oprette nye objekter ikke under kompilering, men under programudførelse, hvilket giver mulighed for dynamisk hukommelsesallokering.
malloc()
Tidligere, for at allokere hukommelse til vores data, ville vi blot erklære:
int x;
Nu kan vi med funktionen malloc() allokere hukommelse dynamisk:
int* pX = (int*)malloc(4);
Funktionen malloc() kræver antallet af bytes, der skal allokeres, som argument. Hvis du ikke kender det nødvendige antal bytes, men kender datatypen, kan du justere udtrykket således:
int* pX = (int*)malloc(sizeof(int));
Hvad sker der nu?
Bemærk, at vi tildeler resultatet af funktionen malloc() til en pointer. Det betyder, at malloc() returnerer en adresse!
Præfikset (int*) er en eksplicit typekonvertering. Vi angiver manuelt den ønskede type. For eksempel:
double x = 3.14;
int y = (int)x; // `y` = 3
Main.c
1234567891011#include <stdio.h> #include <stdlib.h> // new header file! int main() { int* pX = (int*)malloc(sizeof(int)); printf("Address of allocated memory: %p\n", pX); return 0; }
Bemærk
Husk at inkludere header-filen
stdlib.h. Den indeholder prototypen for funktionenmalloc().
For at gemme data på adressen, der leveres af funktionen malloc(), anvendes dereference-operatoren.
Main.c
123456789101112#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); return 0; }
Er det muligt at frigøre hukommelse? – Ja, men kun den hukommelse, der er allokeret med malloc() og lignende funktioner.
free()
Denne funktion anvendes sammen med pointere. For at illustrere dette, lad os udvide eksemplet ovenfor:
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); free(pX); printf("After `free()` value %d at address %p\n", *pX, pX); return 0; }
Interessant nok forbliver en pointer funktionel, selv efter at vi "sletter" den, men værdien, der er gemt i dens tilknyttede hukommelsesplacering, bliver forvrænget.
Dette fører til et problem: en optaget hukommelsescelle indeholder nu upålidelige data. For at undgå disse pointere bør den anvendte pointer nulstilles til NULL.
Main.c
1234567891011121314151617#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf("Value %d at address %p\n", *pX, pX); free(pX); pX = NULL; return 0; }
At sætte en pointer til NULL efter frigivelse af dens hukommelse er en tydelig måde at indikere, at pointeren ikke længere refererer til en gyldig hukommelsesplacering.
Kontroller altid, om pointeren er NULL, før den bruges, for at sikre, at du ikke tilgår ugyldig eller allerede allokeret hukommelse.
Tak for dine kommentarer!