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

bookMalloc og Free

Disse funksjonene gjør det mulig å opprette nye objekter ikke under kompilering, men under programutførelse, slik at vi kan benytte dynamisk minneallokering.

malloc()

Tidligere, for å allokere minne til dataene våre, ville vi ganske enkelt erklære:

int x;

Nå, med funksjonen malloc(), kan vi allokere minne dynamisk:

int* pX = (int*)malloc(4);

Funksjonen malloc() krever antall byte som skal allokeres som argument. Hvis du er usikker på hvor mange byte som trengs, men vet hvilken datatype som skal lagres, kan du tilpasse uttrykket slik:

int* pX = (int*)malloc(sizeof(int));

Hva skjer videre? Legg merke til at vi tilordner resultatet av funksjonen malloc() til en peker. Dette betyr at malloc() returnerer en adresse!

Prefikset (int*) er en eksplisitt typekonvertering. Vi angir manuelt ønsket 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; }

Merk

Husk å inkludere header-filen stdlib.h. Den inneholder prototypen for funksjonen malloc().

For å lagre data på adressen som returneres av funksjonen malloc(), bruker vi dereferanseoperatoren.

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 mulig å frigjøre minne? – Ja, men kun minnet som er allokert med malloc() og lignende funksjoner.

free()

Denne funksjonen brukes sammen med pekere. For å illustrere, la oss utvide eksempelet 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, selv etter at vi "sletter" en peker, forblir den funksjonell, men verdien som er lagret i den tilknyttede minneplassen blir ødelagt.

Dette fører til et problem: en opptatt minnecelle inneholder nå upålitelig data. For å forhindre slike pekere, bør den brukte pekeren tilbakestilles 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; }

Å sette en peker til NULL etter at minnet er frigjort, er en tydelig måte å indikere at pekeren ikke lenger refererer til en gyldig minneplassering.

Sjekk alltid om pekeren er NULL før du bruker den for å sikre at du ikke får tilgang til ugyldig eller allerede allokert minne.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 6. Kapittel 4

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Suggested prompts:

Can you explain more about how malloc() and free() work together?

What happens if I forget to free memory allocated with malloc()?

Why is it important to set a pointer to NULL after freeing it?

Awesome!

Completion rate improved to 2.63

bookMalloc og Free

Sveip for å vise menyen

Disse funksjonene gjør det mulig å opprette nye objekter ikke under kompilering, men under programutførelse, slik at vi kan benytte dynamisk minneallokering.

malloc()

Tidligere, for å allokere minne til dataene våre, ville vi ganske enkelt erklære:

int x;

Nå, med funksjonen malloc(), kan vi allokere minne dynamisk:

int* pX = (int*)malloc(4);

Funksjonen malloc() krever antall byte som skal allokeres som argument. Hvis du er usikker på hvor mange byte som trengs, men vet hvilken datatype som skal lagres, kan du tilpasse uttrykket slik:

int* pX = (int*)malloc(sizeof(int));

Hva skjer videre? Legg merke til at vi tilordner resultatet av funksjonen malloc() til en peker. Dette betyr at malloc() returnerer en adresse!

Prefikset (int*) er en eksplisitt typekonvertering. Vi angir manuelt ønsket 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; }

Merk

Husk å inkludere header-filen stdlib.h. Den inneholder prototypen for funksjonen malloc().

For å lagre data på adressen som returneres av funksjonen malloc(), bruker vi dereferanseoperatoren.

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 mulig å frigjøre minne? – Ja, men kun minnet som er allokert med malloc() og lignende funksjoner.

free()

Denne funksjonen brukes sammen med pekere. For å illustrere, la oss utvide eksempelet 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, selv etter at vi "sletter" en peker, forblir den funksjonell, men verdien som er lagret i den tilknyttede minneplassen blir ødelagt.

Dette fører til et problem: en opptatt minnecelle inneholder nå upålitelig data. For å forhindre slike pekere, bør den brukte pekeren tilbakestilles 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; }

Å sette en peker til NULL etter at minnet er frigjort, er en tydelig måte å indikere at pekeren ikke lenger refererer til en gyldig minneplassering.

Sjekk alltid om pekeren er NULL før du bruker den for å sikre at du ikke får tilgang til ugyldig eller allerede allokert minne.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 6. Kapittel 4
some-alt