Innan vi förstår malloc () och calloc () -funktionerna först låt oss förstå betydelsen av dynamisk minnesallokering. Minnesallokering är proceduren för att tilldela datorns minne för att utföra program och processer. Vi använder dynamiska allokeringstekniker när det inte är känt förut hur mycket minne som behövs för programmet och processen.
Dynamisk minnesallokering uppstår på grund av problemen i samband med statisk minnesallokering, till exempel om färre element lagras, blir resten av minnet i onödan bortkastat. Därför övervinner den problemen med statisk minnesallokering där minnet endast tilldelas när det krävs.
Jämförelsediagram
Grunder för jämförelse | malloc () | calloc () |
---|---|---|
Antal block | Tilldelar enskilt block av efterfrågat minne. | Tilldelar flera block av det begärda minnet. |
Syntax | void * malloc (size_t storlek); | void * calloc (size_t num, size_t storlek); |
initiering | malloc () rensar inte och initierar det tilldelade minnet. | Det tilldelade minnet initialiseras till noll med hjälp av calloc (). |
Tilldelningsmetod | malloc () -funktionen tilldelar minnet av storlek 'storlek' från högen. | calloc () -funktionen allokerar minne vars storlek är lika med num * -storlek. |
Fart | Snabb | Jämförelsevis långsam. |
Definition av malloc ()
Malloc- funktionen tilldelar ett block av minne i byte . Användaren bör uttryckligen ge den blockstorlek som krävs för användningen.
Genom malloc-funktionsprogram begär RAM-minne för systemet för allokering av minnet, om förfrågan är inkommen (dvs malloc-funktionen säger framgångsrikt vid allokering av minne), returnerar den en pekare till det första blocket av minne. Den returnerar void typ av pekare, det vill säga vilken typ av pekare som helst kan tilldelas.
Även om det returnerar en NULL, om mallocfunktionerna inte kan allokera den önskade mängden minne. Malloc-funktionen är tillgänglig i TURBO C, headerfil alloc.h
eller stdlib.h
, och på UNIX kommer den att finnas tillgänglig i headerfilen .
SYNTAX
Syntaxen för denna funktion är enligt följande:
malloc(number of elements * size of each element);
till exempel, int *ptr;
ptr=malloc(10*sizeof (int))
Där storleken representerar storleken på minnet som krävs i byte (dvs. antalet angränsande minnesplatser som ska tilldelas).
Men som tidigare nämnts returnerar funktionen malloc en tomrumsindikator och därför krävs en cast-operatör för att ändra den returnerade pekartypen baserat på vårt behov. Ovanstående deklaration kan presenteras i följande form:
ptr_var=(type_cast* ) malloc (size)
Där ptr_var
är namnet på pekaren som behåller startadressen för det tilldelade minnesblocket, är type_cast
den datatyp i vilken den återvändande pekaren (eller typ tomrum) ska transformeras och storlek beskriver storleken på det tilldelade minnesblocket i byte .
Till exempel: int *ptr;
ptr=(int*) malloc (10 * size of (int));
Minne som tilldelats av malloc-funktionen innehåller skräppost .
Observera att för att verifiera att om motsvarande förfrågan genereras av malloc för att allokera minnet som ges av system RAM, eller avvisas (om det behövs utrymme är inte tillgängligt) Vi kan utnyttja egenskapen där den nödvändiga mängden minne inte är tilldelat malloc-funktionen returnerar en NULL.
Definition av calloc ()
Calloc- funktionen fungerar exakt samma som malloc- funktionen, med undantag för det faktum att det kräver två argument som i fallet med malloc () bara ett argument behövs.
Till exempel: int*ptr;
ptr = (int*)calloc(10, 2);
Här 2 specificerar storleken på datatypen i en byte för vilken vi vill att tilldelningen ska göras, vilket är detta fall är 2 för heltal. Och 10 anger antalet element för vilka allokering ska göras.
Kom ihåg att argumentet som passerade till funktionen malloc var (n * 10), det är ett enda argument förvirras inte eftersom flera argument alltid är åtskilda av kommatecken. Argumentet (n * 10) har inga kommatecken däremellan. Därför är det ett enda argument, men inte en enkel men ett uttryck.
Återkommande till ovanstående deklaration, till följd av utförandet av ovanstående förklaring, tilldelas ett minnesblock av 20 byte till det begärande programmet och adressen till det första blocket tilldelas det begärande programmet och adressen till det första blocket är tilldelad pekaren ptr.
Minne som allokeras av calloc-funktionen håller alla nollor. Calloc-funktionen kan också erhållas i headerfilen eller
i TURBO C.
Viktiga skillnader mellan malloc och calloc
De primära skillnaderna mellan malloc och calloc funktioner är:
- Ett enda block av efterfrågat minne är tilldelat i malloc medan flera block av efterfrågat minne allokeras av calloc.
- Malloc-funktionen rensar inte och initierar det tilldelade minnet. Den innehåller skräppost och objektet i det tilldelade minnet kan inte ändras. I kontrast initierar calloc det tilldelade minnet till noll.
- malloc är snabbare än calloc på grund av kravet på ytterligare steg av initialisering i calloc men skillnaden är försumbar.
- En annan skillnad mellan dessa två är att calloc är en malloc + memset, memset fördelar de fysiska sidorna i minnet medan malloc endast tilldelar minnet från höjden i den virtuella adressen.
Slutsats:
Båda malloc- och callocfunktionerna används för allokering av minnet och har deras speciella fördel, och nackdelen är att malloc är snabb jämfört med callok. Dessutom är malloc lättare att använda eftersom det bara tar ett argument eftersom calloc allokerar minne och initierar minnesområdet med NOLL. Men du föredrar att använda calloc när variabel initialisering är viktigare för dig.