AKO POUŽÍVAŤ FUNKCIU MALLOC V C

How Use Malloc Function C



Malloc je vstavaná funkcia deklarovaná v hlavičkovom súbore. Malloc je krátky názov pre „prideľovanie pamäte“ a používa sa na dynamické prideľovanie jedného veľkého bloku súvislej pamäte podľa zadanej veľkosti. Existujú dva typy alokácie pamäte, statické a dynamické. Alokácia statickej pamäte sa vykonáva v čase kompilácie a nemení sa za behu. Dynamické prideľovanie pamäte na tento účel prideľuje pamäť za behu; používame malloc. Teraz ide o to, odkiaľ pochádza táto pamäť, takže všetky dynamické požiadavky v jazyku C sú splnené z pamäte haldy. V zásade bude mať naša aplikácia/program 3 druhy pamäte

  • Pamäť zásobníka je pre každú metódu lokálna a keď sa metóda vráti, zásobník ju automaticky vymaže.
  • Oblasť globálnej pamäte alokuje pamäť pre všetky globálne premenné. Táto pamäťová oblasť sa vytvorí na začiatku programu a na konci automaticky pamäťovú oblasť vymaže.
  • Halda pamäte je vždy nepriateľom, ktorý spĺňa všetky dynamické požiadavky programu/aplikácie. Kedykoľvek budeme používať funkciu malloc, požičia si z pamäte kopu pamäte a poskytne nám na ňu ukazovateľ.

Syntax:







Syntax malloc je (void*) malloc (size_t size). Syntax teda hovorí, že malloc vyžaduje veľkosť, vráti ukazovateľ v zásade prázdny ukazovateľ a veľkosť t je definovaná ako celé číslo bez znamienka. Funkcia Malloc jednoducho alokuje pamäťový blok podľa veľkosti uvedenej v halde, ako vidíte na syntaxi, že veľkosť je potrebné zadať, a v prípade úspechu vráti ukazovateľ smerujúci na prvý bajt alokovanej pamäte, inak vráti hodnotu NULL. . Úlohou malloc je alokovať pamäť za behu.



Prečo neplatný ukazovateľ:

Malloc nemá predstavu o tom, na čo poukazuje; jednoducho to znamená, že nevie, aké údaje sa uložia do tohto pamäťového umiestnenia. Iba alokuje pamäť požadovanú používateľom bez toho, aby poznal typ údajov, ktoré sa majú uložiť do pamäte. Preto vracia prázdny ukazovateľ.



Malloc alokuje pamäť a potom je na zodpovednosti užívateľa, aby obsadil typ zodpovedajúcim typom, aby mohol byť v programe správne použitý. Ukazovateľ prázdnoty je ukazovateľ, ktorý môže nasmerovať akýkoľvek typ údajov. Malloc vráti ukazovateľ neplatnosti, pretože nevie, aký typ údajov sa uloží do tejto pamäte.





Tu žiadame malloc, aby teraz alokoval 6 bajtov pamäte, ak to úspešne vráti malloc prázdny ukazovateľ. V takom prípade ho musíme obsadiť na ukazovateľ typu celé číslo, pretože do tejto pamäte chceme uložiť celé číslo. Tu malloc alokuje 6 bajtov pamäte na hromadu a adresa prvého bajtu je uložená v ukazovateli ptr.



Príklad programu:

Tu je jednoduchý príklad programu na správne pochopenie pojmu malloc.

Tu vidíte, že s funkciou printf žiadam užívateľa, aby zadal počet celých čísel. Vyhlásili sme dve premenné nad i a n. Premenná n je miesto, kam budeme ukladať číslo zadané používateľom. Potom máme funkciu malloc; chceme, aby malloc alokoval veľkosť zodpovedajúcu veľkosti n celých čísel. Veľkosť vynásobíme, ak int s n; toto nám poskytne veľkosť n celých čísel. Potom malloc vráti neplatný ukazovateľ a my ho prepíšeme na celočíselný ukazovateľ a adresu uložíme do ukazovateľa ptr. Typické obsadenie je dôležité, pretože je to osvedčený postup.

Ak ukazovateľ obsahuje NULL, znamená to, že pamäť nie je k dispozícii. Jednoducho preto opustíme program so stavom zlyhania výstupu. Ak tomu tak nie je, môžeme ľahko spustiť slučku for.

Smyčka bude prebiehať od 0 do n-1 a používateľa požiadame, aby zakaždým zadával celé číslo. V rámci funkcie scanf je jedna vec zapísaná ptr+i, pretože vieme, že ptr obsahuje adresu prvého bajtu pamäte. Povedzme, že adresa je 1000, tu sa pôvodne rovná nule, takže 1 000+0 je 1 000, takže v rámci tejto adresy bude uložené naše prvé celé číslo a potom, keď sa i stane 1, tak 1 000+1, ktoré sa interne interpretuje ako (1 000) +1 *4 ak predpokladám, že veľkosť celého čísla je 4 bajty a bude sa rovnať 1004, takže ďalšie celé číslo bude uložené na mieste 1004. A takto to bude pokračovať aj naďalej, adresy budú 1000, 1004, 1008 a tak ďalej. Nepoužívame ampersand pred ptr+i, pretože ptr nám už dáva adresu, keď píšeme ptr, čo je jednoducho ukazovateľ, a obsahuje adresu, nie hodnotu, takže nie je potrebné uvádzať pred ním ampersand a tento koncept by mal byť jasný.

Tu v tejto slučke jednoducho robíme jednu vec, ktorou tlačíme všetky celé čísla na obrazovku; samozrejme používame ptr+i, ale tu v tomto prípade dereferujeme, pretože ptr+i predstavuje adresu, takže ju musíme dereferovať. Ak sa rovná 0, bude to 1000, pretože predpokladáme, že prvá adresa bude 1000, takže dereferencujeme; dostaneme prvé celé číslo, potom i sa rovná 1, a stane sa 1001, ale interpretované ako 1004, ak je veľkosť celého čísla 4. Opäť. Dereferencujeme to, takže nám to poskytne 2ndcelé číslo. Týmto spôsobom všetko funguje.

Je to teda v podstate jednoduchý program, ktorý požaduje, aby používatelia zadali n celé číslo, a potom tieto celé čísla jednoducho zobrazíme na obrazovke. Po spustení programu sa zobrazí toto.

Najprv požiadame používateľa, aby zadal počet celých čísel, a potom zadá celé čísla a my ich jednoducho zobrazíme na obrazovke.

Záver:

Na vyššie uvedenom programe nie je nič zlé, pokiaľ v ňom pokračujeme veľmi dlho, pretože tu si požičiavame pamäť z haldy, ale nikdy nevraciame pamäť späť na haldu, ale iba v takom prípade, keď program/aplikácia majú bežať 24 hodín. Budú opäť volať funkciu malloc, a to opäť znamená, že zakaždým, keď si požičajú pamäť z haldy a už sa nevrátia, je to zlé programovanie, takže by sme mali pred návratom písať zadarmo (adresa pamäte, ktorá by mala byť uvoľnená). Preto je vždy dôležité použitie mallocu zadarmo. Použitím mallocu sme teda zachovali pamäť a malloc alokuje pamäť tak veľkú, ako ju žiadate.

Šťastné dynamické prideľovanie pamäte!