Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Malloc och Free | Pekare
C-Grunder

bookMalloc 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

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; }

Observera

Kom ihåg att inkludera header-filen stdlib.h. Den innehåller prototypen för funktionen malloc().

För att lagra data på adressen som tillhandahålls av funktionen malloc(), används dereferensoperatorn.

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; }

Ä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

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; }

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

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; }

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.

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 6. Kapitel 4

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

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

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; }

Observera

Kom ihåg att inkludera header-filen stdlib.h. Den innehåller prototypen för funktionen malloc().

För att lagra data på adressen som tillhandahålls av funktionen malloc(), används dereferensoperatorn.

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; }

Ä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

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; }

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

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; }

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.

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 6. Kapitel 4
some-alt