Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Malloc og Free | Pointere
C-Grundlæggende

bookMalloc 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

Main.c

copy
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 funktionen malloc().

For at gemme data på adressen, der leveres af funktionen malloc(), anvendes dereference-operatoren.

Main.c

Main.c

copy
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

Main.c

copy
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

Main.c

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

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 6. Kapitel 4

Spørg AI

expand

Spørg AI

ChatGPT

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

bookMalloc 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

Main.c

copy
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 funktionen malloc().

For at gemme data på adressen, der leveres af funktionen malloc(), anvendes dereference-operatoren.

Main.c

Main.c

copy
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

Main.c

copy
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

Main.c

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

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 6. Kapitel 4
some-alt