malloc() Funktion i C-bibliotek med EXEMPEL

โšก Smart sammanfattning

malloc() i C reserverar ett minnesblock pรฅ heapen vid kรถrning och returnerar en void-pekare till sin fรถrsta byte, vilket lรฅter program begรคra lagring vars storlek รคr okรคnd tills koden faktiskt exekveras.

  • ๐Ÿง  Kรถrtidsallokering: malloc() reserverar minne under kรถrning nรคr den erforderliga storleken inte รคr kรคnd vid kompileringstillfรคllet.
  • ๐Ÿ“ฆ Syntax: En cast_type-pekare tar emot malloc(byte_size), vanligtvis dimensionerad med sizeof fรถr portabilitet.
  • โš ๏ธ NULL-kontroll: En misslyckad begรคran returnerar en NULL-pekare, sรฅ validera resultatet innan du avreferenserar det.
  • โž• Pekararitmetik: Blocket รคr sammanhรคngande, sรฅ anvรคnd + istรคllet fรถr ++ fรถr att nรฅ arrayelement.
  • ๐Ÿงน Frigรถr minnet: Slรคpp varje block med free() fรถr att fรถrhindra minneslรคckor och dinglande pekare.
  • ๐Ÿค– AI-hjรคlp: AI-assistenter och GitHub Copilot utarbetar malloc()-anrop och flaggar saknade free()-satser.

malloc()-funktionen i C

Vad รคr malloc i C?

Funktionen malloc() stรฅr fรถr minnesallokering. Det รคr en funktion som anvรคnds fรถr att tilldela ett minnesblock dynamiskt. Den reserverar minnesutrymme av specificerad storlek och returnerar nollpekaren som pekar till minnesplatsen. Pekaren som returneras รคr vanligtvis av typen void. Det betyder att vi kan tilldela malloc-funktion till vilken pekare som helst.

Vad รคr malloc i C

syntax

ptr = (cast_type *) malloc (byte_size);

Hรคr,

  • ptr รคr en pekare av cast_type.
  • Malloc-funktionen returnerar en pekare till det tilldelade minnet av byte_size.
Example: ptr = (int *) malloc (50)

Nรคr denna sats exekveras framgรฅngsrikt, reserveras ett minnesutrymme pรฅ 50 byte. Adressen fรถr den fรถrsta byten av reserverat utrymme tilldelas pekaren ptr av typen int.

Tรคnk pรฅ ett annat exempel pรฅ malloc-implementering:

#include <stdlib.h>
int main(){
int *ptr;
ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */
    if (ptr != NULL) {
      *(ptr + 5) = 480; /* assign 480 to sixth integer */
      printf("Value of the 6th integer is %d",*(ptr + 5));
    }
}

Produktion:

Value of the 6th integer is 480

Observera att sizeof(*ptr) anvรคndes istรคllet fรถr sizeof(int) fรถr att gรถra koden mer robust nรคr *ptr-deklarationen typecastas till en annan datatyp senare.

Tilldelningen kan misslyckas om minnet inte rรคcker till. I det hรคr fallet returnerar den en NULL-pekare. Sรฅ du bรถr inkludera kod fรถr att leta efter en NULL-pekare.

Tรคnk pรฅ att det allokerade minnet รคr sammanhรคngande och kan behandlas som en array. Vi kan anvรคnda pekare aritmetik fรถr att komma รฅt arrayelementen istรคllet fรถr att anvรคnda parenteser []. Vi rekommenderar att anvรคnda + fรถr att referera till arrayelement eftersom anvรคndning av inkrementering ++ eller += รคndrar adressen som lagras av pekaren.

Malloc-funktionen kan ocksรฅ anvรคndas med teckendatatypen sรฅvรคl som komplexa datatyper som strukturer.

Varfรถr anvรคnda malloc() i C?

Statiska arrayer och vanliga variabler fixerar sin storlek nรคr programmet kompileras, vilket slรถsar utrymme nรคr kravet visar sig vara mindre och misslyckas direkt nรคr det visar sig vara stรถrre. malloc() lรถser detta genom att begรคra minne vid kรถrning, sรฅ att ett program kan anpassa storleken pรฅ en buffert till den exakta mรคngd data det tar emot. Denna flexibilitet vid kรถrning รคr kรคrnan i dynamisk minnesallokering i C.

Dynamisk allokering med malloc() รคr rรคtt val i flera vanliga situationer:

  • Mรคngden indata รคr okรคnd fรถrrรคn programmet kรถrs, till exempel nรคr en fil eller en anvรคndarlevererad lista lรคses.
  • Stora block behรถvs som skulle รถverflรถda den begrรคnsade stacken, eftersom malloc() hรคmtar data frรฅn den mycket stรถrre heapen.
  • Data mรฅste รถverleva den funktion som skapade den, eftersom heap-minnet kvarstรฅr tills det explicit slรคpps.
  • Strukturer och arrayer mรฅste vรคxa eller krympa medan programmet kรถrs.

Eftersom det reserverade blocket lรคmnas tillbaka som en pekare kan det skickas mellan funktioner billigt utan att kopiera underliggande data.

Hur man frigรถr minne allokerat av malloc()

Minne som reserveras av malloc() finns pรฅ heapen och frigรถrs aldrig automatiskt. Nรคr ett program fortsรคtter att allokera utan att frigรถra, fรถrbrukar det lรฅngsamt allt tillgรคngligt minne, en defekt som kallas minneslรคcka. Funktionen free() returnerar ett fรคrdigt block till systemet sรฅ att utrymmet kan รฅteranvรคndas.

Funktionen free() tar ett enda argument, pekaren som malloc() returnerade, och slรคpper hela blocket pรฅ en gรฅng:

int *ptr;
ptr = malloc(10 * sizeof(int));
if (ptr != NULL) {
    /* use the allocated memory here */
    free(ptr);   /* release the block */
    ptr = NULL;  /* avoid a dangling pointer */
}

Fรถlj dessa regler fรถr att hantera dynamiskt minne pรฅ ett sรคkert sรคtt:

  • Anropa free() exakt en gรฅng fรถr varje lyckad malloc(); att frigรถra samma block tvรฅ gรฅnger orsakar odefinierat beteende.
  • Sรคtt pekaren till NULL efter frigรถring sรฅ att den inte kan รฅteranvรคndas som en dinglande pekare.
  • Frigรถr aldrig en pekare som malloc() inte returnerade, inklusive en som fรถrskjutits av pekararitmetik.
  • Matcha varje allokering med en matchande release innan pekaren gรฅr utanfรถr rรคckvidden.

keeping Balanserad allokering och frigรถring รคr kรคrndisciplinen fรถr manuell minneshantering i C, och det fรถrhindrar bรฅde lรคckor och krascher orsakade av รฅteranvรคndning av frigjort minne.

malloc() vs calloc(): Viktiga skillnader

malloc() och calloc() bรฅda reserverar heap-minne, men de skiljer sig รฅt i sina argument och i hur de behandlar det nya blocket. malloc() tar ett argument, det totala antalet byte, och lรคmnar innehรฅllet oinitierat, sรฅ blocket innehรฅller ofรถrutsรคgbara skrรคpvรคrden tills programmet skriver till det. calloc() tar tvรฅ argument, antalet element och storleken pรฅ varje, och rensar varje byte till noll innan pekaren returneras.

De praktiska skillnaderna kan handla om tre punkter:

  • Initialisering: calloc() nollstรคller minnet, medan malloc() inte gรถr det, vilket gรถr malloc() nรฅgot snabbare nรคr vรคrdena รคndรฅ kommer att skrivas รถver.
  • Argument: du skriver malloc(n * size) men calloc(n, size) fรถr att reservera samma array.
  • Anvรคndningsfall: vรคlj calloc() nรคr ett rent, nollstรคllt block รคr viktigt, och malloc() nรคr hastighet fรถredras och initialisering hanteras manuellt.

Bรฅda funktionerna deklareras i stdlib.h, bรฅda returnerar en void-pekare eller NULL vid fel, och bรฅda lรคmnar tillbaka sitt minne med samma free()-funktion.

Vanliga frรฅgor

I C รคr konverteringen valfri och avrรฅds ofta, eftersom void* automatiskt konverterar till vilken objektpekare som helst och en explicit konvertering kan maskera en saknad stdlib.h include. C++, dock krรคvs rollbesรคttningen.

En NULL-retur innebรคr att begรคran misslyckades, vanligtvis pรฅ grund av otillrรคckligt minne. Kontrollera alltid pekaren innan du anvรคnder den, eftersom avreferensering av NULL leder till odefinierat beteende och vanligtvis kraschar programmet.

realloc() รคndrar storlek pรฅ ett block som tidigare reserverats av malloc(), keeping befintlig data upp till den mindre storleken. Om det misslyckas returnerar det NULL och lรคmnar det ursprungliga blocket intakt, sรฅ tilldela fรถrst dess resultat till en tillfรคllig pekare.

En minneslรคcka uppstรฅr nรคr heapminne frรฅn malloc() aldrig frigรถrs med free(). Programmet fortsรคtter att reservera utrymme som det inte lรคngre anvรคnder, vilket gradvis kan fรถrbruka det tillgรคngliga minnet.

malloc() reserverar minne pรฅ heapen, inte stacken. Heapblock fรถrblir giltiga tills du anropar free(), sรฅ de kan รถverleva funktionen som skapade dem, till skillnad frรฅn automatiska stackvariabler som fรถrsvinner vid retur.

malloc() รคr en biblioteksfunktion som returnerar void* och behรถver sizeof fรถr att berรคkna byte. C++ new รคr en operator som returnerar en typad pekare och anropar konstruktorer. Para ihop malloc() med free() och new med delete.

Ja. AI-kodningsassistenter utarbetar malloc()-anrop, infogar NULL-kontroller och flaggar saknade free()-anrop eller lรคckor, och de kan fรถrklara pekararitmetik. Kompilera och testa alltid den genererade koden innan du litar pรฅ den.

GitHub Copilot fรถreslรฅr malloc(), sizeof() och matchande free()-rader frรฅn en kommentar som beskriver din avsikt. RevVisa varje fรถrslag pรฅ saknade NULL-kontroller och lรคckor innan du kompilerar.

Sammanfatta detta inlรคgg med: