Malloc och Free
Dessa funktioner gör det möjligt att skapa nya objekt inte under kompilering, utan under programmets körning, vilket möjliggör användning av dynamisk minnesallokering.
malloc()
Tidigare, för att allokera minne för våra data, deklarerade vi helt enkelt:
int x;
Nu, med funktionen malloc(), kan vi allokera minne dynamiskt:
int* pX = (int*)malloc(4);
Funktionen malloc() kräver antalet byte som ska allokeras som argument. Om du är osäker på hur många byte som behövs, men vet vilken datatyp som ska lagras, kan du justera uttrycket så här:
int* pX = (int*)malloc(sizeof(int));
Vad händer härnäst?
Observera att vi tilldelar resultatet av funktionen malloc() till en pekare. Detta innebär att malloc() returnerar en adress!
Prefixen (int*) är en explicit typomvandling. Den önskade typen anges manuellt. Till exempel:
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; }
Observera
Kom ihåg att inkludera header-filen
stdlib.h. Den innehåller prototypen för funktionenmalloc().
För att lagra data på adressen som tillhandahålls av funktionen malloc(), används dereferensoperatorn.
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; }
Är det möjligt att frigöra minne? – Ja, men endast det minne som har allokerats med malloc() och liknande funktioner.
free()
Denna funktion används tillsammans med pekare. För att illustrera, låt oss bygga vidare på exemplet ovan:
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; }
Intressant nog, även efter att vi "tar bort" en pekare, förblir den funktionell, men värdet som lagras på dess associerade minnesplats blir förvrängt.
Detta leder till ett problem: en upptagen minnescell innehåller nu opålitliga data. För att förhindra dessa pekare bör den använda pekaren återställas till 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; }
Att sätta en pekare till NULL efter att dess minne har frigjorts är ett tydligt sätt att indikera att pekaren inte längre refererar till en giltig minnesplats.
Kontrollera alltid om pekaren är NULL innan du använder den för att säkerställa att du inte får åtkomst till ogiltigt eller redan allokerat minne.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
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 och Free
Svep för att visa menyn
Dessa funktioner gör det möjligt att skapa nya objekt inte under kompilering, utan under programmets körning, vilket möjliggör användning av dynamisk minnesallokering.
malloc()
Tidigare, för att allokera minne för våra data, deklarerade vi helt enkelt:
int x;
Nu, med funktionen malloc(), kan vi allokera minne dynamiskt:
int* pX = (int*)malloc(4);
Funktionen malloc() kräver antalet byte som ska allokeras som argument. Om du är osäker på hur många byte som behövs, men vet vilken datatyp som ska lagras, kan du justera uttrycket så här:
int* pX = (int*)malloc(sizeof(int));
Vad händer härnäst?
Observera att vi tilldelar resultatet av funktionen malloc() till en pekare. Detta innebär att malloc() returnerar en adress!
Prefixen (int*) är en explicit typomvandling. Den önskade typen anges manuellt. Till exempel:
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; }
Observera
Kom ihåg att inkludera header-filen
stdlib.h. Den innehåller prototypen för funktionenmalloc().
För att lagra data på adressen som tillhandahålls av funktionen malloc(), används dereferensoperatorn.
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; }
Är det möjligt att frigöra minne? – Ja, men endast det minne som har allokerats med malloc() och liknande funktioner.
free()
Denna funktion används tillsammans med pekare. För att illustrera, låt oss bygga vidare på exemplet ovan:
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; }
Intressant nog, även efter att vi "tar bort" en pekare, förblir den funktionell, men värdet som lagras på dess associerade minnesplats blir förvrängt.
Detta leder till ett problem: en upptagen minnescell innehåller nu opålitliga data. För att förhindra dessa pekare bör den använda pekaren återställas till 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; }
Att sätta en pekare till NULL efter att dess minne har frigjorts är ett tydligt sätt att indikera att pekaren inte längre refererar till en giltig minnesplats.
Kontrollera alltid om pekaren är NULL innan du använder den för att säkerställa att du inte får åtkomst till ogiltigt eller redan allokerat minne.
Tack för dina kommentarer!