Malloc 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
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 funksjonenmalloc().
For å lagre data på adressen som returneres av funksjonen malloc(), bruker vi dereferanseoperatoren.
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 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
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
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.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
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
Malloc 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
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 funksjonenmalloc().
For å lagre data på adressen som returneres av funksjonen malloc(), bruker vi dereferanseoperatoren.
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 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
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
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.
Takk for tilbakemeldingene dine!