C Programmeren

HOE DE MALLOC-FUNCTIE IN C . TE GEBRUIKEN

HOE DE MALLOC-FUNCTIE IN C . TE GEBRUIKEN
Malloc is een ingebouwde functie gedeclareerd in het headerbestand . Malloc is de korte naam voor 'geheugentoewijzing' en wordt gebruikt om dynamisch een enkel groot blok aaneengesloten geheugen toe te wijzen volgens de opgegeven grootte. Er zijn twee soorten geheugentoewijzing, statisch en dynamisch:. Statische geheugentoewijzing wordt gedaan tijdens het compileren en verandert niet tijdens runtime. Dynamische geheugentoewijzing wijst hiervoor tijdens runtime geheugen toe; we gebruiken malloc. Het punt is nu waar dit geheugen vandaan komt, dus alle dynamische vereisten in C worden vervuld vanuit het heapgeheugen. In principe heeft onze applicatie/programma 3 soorten geheugen

  • Het stapelgeheugen is lokaal voor elke methode en wanneer de methode terugkeert, wist de stapel deze automatisch.
  • Het globale geheugengebied wijst geheugen toe voor alle globale variabelen. Dit geheugengebied wordt aan het begin van het programma gemaakt en aan het einde wordt het geheugengebied automatisch gewist.
  • Heap-geheugen is altijd een vijand die voldoet aan alle dynamische vereisten van programma / applicatie. Telkens wanneer we de malloc-functie gaan gebruiken, zal het wat geheugen van de heap lenen en ons de aanwijzer ernaar geven.

Syntaxis:

De syntaxis van malloc is (void*)malloc(size_t size). Dus de syntaxis zegt dat malloc een grootte vereist, het zal de aanwijzer in feite een lege aanwijzer retourneren en de grootte t is gedefinieerd in als een geheel getal zonder teken. De Malloc-functie wijst eenvoudig een geheugenblok toe volgens de grootte die is opgegeven in de heap, zoals je kunt zien in de syntaxis die de grootte moet worden opgegeven en bij succes retourneert het een aanwijzer die naar de eerste byte van het toegewezen geheugen wijst. Anders retourneert NULL. Dus de taak van malloc is om geheugen toe te wijzen tijdens runtime.

Waarom ongeldige aanwijzer:

Malloc heeft geen idee waar het naar verwijst; het betekent gewoon dat het niet weet welke gegevens op die geheugenlocatie zullen worden opgeslagen. Het wijst alleen geheugen toe dat door de gebruiker is aangevraagd zonder te weten welk type gegevens in het geheugen moet worden opgeslagen. Dat is waarom het een lege aanwijzer retourneert.

Malloc wijst gewoon geheugen toe, daarna is het de verantwoordelijkheid van de gebruiker om naar een geschikt type te typen, zodat het correct in het programma kan worden gebruikt. Void pointer is een pointer die naar elk type data kan wijzen. Malloc retourneert een ongeldige pointer omdat het niet weet welk type data in dat geheugen wordt opgeslagen.

Hier vragen we malloc om nu 6 bytes geheugen toe te wijzen als het een succes is, zal malloc een lege aanwijzer retourneren. In dat geval moeten we het naar een integer type aanwijzer typen omdat we een integer in dat geheugen willen opslaan. Hier wijst malloc 6 bytes geheugen toe in een heap, en het adres van de eerste byte wordt opgeslagen in de pointer ptr.

Voorbeeld programma:

Hier is een eenvoudig voorbeeldprogramma om het concept van malloc op een juiste manier te begrijpen.

Hier kun je met de printf-functie zien dat ik de gebruiker vraag om het aantal gehele getallen in te voeren. We hebben twee variabelen boven i en n . gedeclareerd. Variabele n is de plaats waar we het door de gebruiker ingevoerde nummer opslaan. Daarna hebben we de malloc-functie; we willen dat de malloc de grootte toewijst die overeenkomt met de grootte van n gehele getallen. We vermenigvuldigen size if int met n; dit geeft ons de grootte van n gehele getallen. Daarna zal malloc een lege aanwijzer retourneren, en we typen deze naar een integer-aanwijzer, en we slaan het adres op in de ptr-aanwijzer. Typecasting is belangrijk omdat het een goede gewoonte is.

Als de aanwijzer nu NULL bevat, betekent dit dat het geheugen niet beschikbaar is. Dus we zullen het programma gewoon verlaten met de exit-foutstatus. Als dit niet het geval is, kunnen we eenvoudig de for a loop uitvoeren.

De lus loopt van 0 tot n-1, en we zullen de gebruiker vragen om elke keer een geheel getal één voor één in te voeren. Binnen de scanf-functie is er één ding geschreven ptr+i omdat we weten dat ptr het adres van de eerste byte van het geheugen bevat. Laten we zeggen dat het adres 1000 is, hier is i gelijk aan nul, dus 1000+0 is 1000, dus binnen dat adres wordt ons eerste gehele getal opgeslagen en daarna wanneer i 1 wordt, dus 1000+1 wat intern geïnterpreteerd is als (1000) +1 *4 als ik aanneem dat de grootte van het gehele getal 4 bytes is, en het zou gelijk zijn aan 1004, dus het volgende gehele getal wordt opgeslagen op de locatie 1004. En dit zal op deze manier doorgaan, de adressen zijn als 1000, 1004, 1008 enzovoort. We gebruiken geen ampersand voor ptr+i omdat ptr ons al het adres geeft wanneer we ptr schrijven, wat gewoon een pointer is, en het bevat het adres, niet de waarde, dus er is geen vereiste om ampersand ervoor te plaatsen, en dit concept moet duidelijk zijn.

Hier in deze lus doen we gewoon één ding, we printen alle gehele getallen op het scherm; uiteraard gebruiken we ptr+i, maar hier, in dit geval, dereferen we het omdat ptr+i een adres vertegenwoordigt, dus we moeten het derefereren. Als i gelijk is aan 0, is het 1000 omdat we aannemen dat het eerste adres 1000 zal zijn, dus we verwijzen ernaar; we krijgen het eerste gehele getal, dan is i gelijk aan 1, en het wordt 1001, maar geïnterpreteerd als 1004 als de grootte van het gehele getal 4 is. Opnieuw. We verwijzen er naar uit, dus het geeft ons de 2nd geheel getal. Op deze manier werkt alles.

Dit is dus eigenlijk een eenvoudig programma dat gebruikers vraagt ​​om n geheel getal in te voeren, en dan tonen we die gehele getallen op het scherm. Nadat het programma is uitgevoerd, wordt dit weergegeven:.

Eerst vragen we de gebruiker om het aantal gehele getallen in te voeren, en vervolgens voert de gebruiker de gehele getallen in, en we geven ze gewoon op het scherm weer.

Conclusie:

Er is niets mis met het bovenstaande programma, zolang we het heel lang voortzetten, hier lenen we geheugen van de heap, maar we brengen het geheugen nooit terug naar de heap. om voor een lange duur te lopen, zoals 24 uur. Ze zullen de malloc-functie opnieuw aanroepen, en nogmaals, dat betekent dat elke keer dat ze geheugen van de heap lenen en nooit terugkeren, dit slechte programmering is, dus we moeten vrij schrijven (het adres van het geheugen dat moet worden vrijgegeven) voordat we terugkeren. Dus wanneer het gebruik van malloc free belangrijk is. Dus met malloc hebben we geheugen behouden, en malloc wijst geheugen toe zo groot als je het vraagt ​​you.

Gelukkig dynamisch geheugentoewijzing!

HD Remastered Games voor Linux die nog nooit eerder een Linux-release hebben gehad
Veel game-ontwikkelaars en uitgevers komen met HD-remaster van oude games om de levensduur van franchise te verlengen, fans die compatibiliteit met mo...
Hoe AutoKey te gebruiken om Linux-spellen te automatiseren
AutoKey is een hulpprogramma voor desktopautomatisering voor Linux en X11, geprogrammeerd in Python 3, GTK en Qt. Met behulp van de scripting- en MACR...
Hoe FPS-teller in Linux-games te tonen
Linux-gaming kreeg een grote duw toen Valve in 2012 Linux-ondersteuning voor Steam-client en hun games aankondigde. Sindsdien hebben veel AAA- en indi...