JAK POUŽÍVAT FUNKCI MALLOC V C

How Use Malloc Function C



Malloc je vestavěná funkce deklarovaná v souboru záhlaví. Malloc je krátký název pro „přidělování paměti“ a používá se k dynamickému přidělení jednoho velkého bloku souvislé paměti podle zadané velikosti. Existují dva typy přidělení paměti statické a dynamické. Přidělení statické paměti se provádí v době kompilace a nemění se za běhu. Dynamická alokace paměti k tomu přiděluje paměť za běhu; používáme malloc. Nyní jde o to, odkud tato paměť pochází, takže všechny dynamické požadavky v jazyce C jsou splněny z paměti haldy. Naše aplikace/program bude mít v zásadě 3 druhy paměti

  • Paměť zásobníku je pro každou metodu lokální, a když se metoda vrátí, zásobník ji automaticky vymaže.
  • Oblast globální paměti přiděluje paměť pro všechny globální proměnné. Tato paměťová oblast se vytvoří na začátku programu a na konci ji automaticky vymaže.
  • Halda paměti je vždy nepřítelem, který splňuje všechny dynamické požadavky programu/aplikace. Kdykoli budeme používat funkci malloc, půjčí si z hromady nějakou paměť a dá nám na ni ukazatel.

Syntax:







Syntaxe malloc je (void*) malloc (size_t size). Syntaxe tedy říká, že malloc vyžaduje velikost, vrátí ukazatel v podstatě prázdný ukazatel a velikost t je definována jako celé číslo bez znaménka. Funkce Malloc jednoduše přiděluje paměťový blok podle velikosti uvedené v haldě, jak můžete vidět na syntaxi, kterou je třeba zadat, a v případě úspěchu vrátí ukazatel směřující na první bajt přidělené paměti, jinak vrátí NULL . Úkolem malloc je tedy přidělit paměť za běhu.



Proč neplatný ukazatel:

Malloc nemá tušení, na co ukazuje; jednoduše to znamená, že neví, jaká data se do toho paměťového místa uloží. Pouze přiděluje paměť požadovanou uživatelem, aniž by věděl, jaký typ dat má být uložen v paměti. Proto vrací prázdný ukazatel.



Malloc poté alokuje paměť a poté je odpovědností uživatele přepsat typ na vhodný typ, aby jej bylo možné v programu správně použít. Ukazatel prázdnoty je ukazatel, který může ukazovat na jakýkoli typ dat, malloc vrací ukazatel neplatnosti, protože neví, jaký typ dat bude uložen v této paměti.





Zde žádáme malloc, aby nyní alokoval 6 bajtů paměti, pokud bude úspěšný malloc vrátí prázdný ukazatel. V takovém případě ho musíme přepsat na ukazatel typu celé číslo, protože chceme do této paměti uložit celé číslo. Zde malloc alokuje 6 bajtů paměti v hromadě a adresa prvního bajtu je uložena v ukazateli ptr.



Příklad programu:

Zde je jednoduchý příklad programu, který má správně porozumět pojmu malloc.

Zde můžete vidět s funkcí printf Žádám uživatele, aby zadal počet celých čísel. Deklarovali jsme dvě proměnné nad i a n. Proměnná n je místo, kam budeme ukládat číslo zadané uživatelem. Poté máme funkci malloc; chceme, aby malloc alokoval velikostní ekvivalent odpovídající velikosti n celých čísel. Násobíme velikost, pokud int s n; tím získáme velikost n celých čísel. Poté malloc vrátí neplatný ukazatel a my jej přetypujeme na celočíselný ukazatel a adresu uložíme do ukazatele ptr. Typový odlitek je důležitý, protože je to dobrá praxe.

Pokud ukazatel obsahuje NULL, znamená to, že paměť není k dispozici. Jednoduše tedy opustíme program se stavem selhání ukončení. Pokud tomu tak není, můžeme snadno spustit smyčku for.

Smyčka poběží od 0 do n-1 a požádáme uživatele, aby pokaždé zadával celé číslo. Ve funkci scanf je jedna věc napsaná ptr+i, protože víme, že ptr obsahuje adresu prvního bajtu paměti. Řekněme, že adresa je 1000, zde se zpočátku rovná nule, takže 1000+0 je 1000, takže v rámci této adresy bude uloženo naše první celé číslo a poté, když se i stane 1, tak 1 000+1, které se interně interpretuje jako (1 000) +1 *4 pokud předpokládám, že velikost celého čísla je 4 bajty a bude se rovnat 1004, takže další celé číslo bude uloženo v umístění 1004. A takto to bude pokračovat, adresy jsou 1000, 1004, 1008 atd. Nepoužíváme ampersand před ptr+i, protože ptr nám již dává adresu, když píšeme ptr, což je jednoduše ukazatel, a obsahuje adresu, nikoli hodnotu, takže není nutné před něj dávat ampersand a tento koncept by měl být jasný.

Zde v této smyčce jednoduše děláme jednu věc, kterou tiskneme všechna celá čísla na obrazovku; samozřejmě používáme ptr+i, ale zde v tomto případě dereferencujeme, protože ptr+i představuje adresu, takže ji musíme zrušit. Pokud se rovnám 0, bude to 1000, protože předpokládáme, že první adresa bude 1000, takže ji odsuzujeme; dostaneme první celé číslo, pak i se rovná 1, a stane se 1001, ale interpretováno jako 1004, pokud je velikost celého čísla 4. Znovu. Dereferencujeme to, takže nám to dá 2ndcelé číslo. Tímto způsobem vše funguje.

Jedná se tedy v podstatě o jednoduchý program, který žádá uživatele, aby zadali n celé číslo, a pak tyto celá čísla jednoduše zobrazujeme na obrazovce. Po spuštění programu se zobrazí toto.

Nejprve požádáme uživatele, aby zadal počet celých čísel, a poté uživatel zadá celá čísla a my je jednoduše zobrazíme na obrazovce.

Závěr:

Na výše uvedeném programu není nic špatného, ​​pokud v něm pokračujeme velmi dlouhou dobu, vypůjčujeme si paměť z hromady, ale nikdy nevracíme paměť zpět na hromadu, to se stane pouze v takovém případě, kdy program/aplikace mají běžet po dlouhou dobu, například 24 hodin. Znovu budou volat funkci malloc, a to opět znamená, že pokaždé, když si vypůjčí paměť z hromady a nikdy se nevrátí, je to špatné programování, takže bychom měli před návratem psát zdarma (adresa paměti, která by měla být uvolněna). Kdykoli je tedy použití malloc free důležité. Použitím mallocu jsme tedy zachovali paměť a malloc alokuje paměť tak velkou, jak ji požadujete.

Šťastné dynamické přidělování paměti!