malloc() Funkcija u C biblioteci s PRIMJEROM
โก Pametni saลพetak
malloc() u C-u rezervira blok memorije na heapu za vrijeme izvoฤenja i vraฤa void pokazivaฤ na njegov prvi bajt, omoguฤujuฤi programima da zatraลพe prostor ฤija je veliฤina nepoznata sve dok se kod zapravo ne izvrลกi.

ล to je malloc u C-u?
Funkcija malloc() oznaฤava dodjelu memorije. To je funkcija koja se koristi za dinamiฤku dodjelu bloka memorije. Rezervira memorijski prostor odreฤene veliฤine i vraฤa nulti pokazivaฤ koji pokazuje na memorijsku lokaciju. Vraฤeni pokazivaฤ obiฤno je tipa void. To znaฤi da bilo kojem pokazivaฤu moลพemo dodijeliti funkciju malloc.
Sintaksa
ptr = (cast_type *) malloc (byte_size);
Ovdje,
- ptr je pokazivaฤ na cast_type.
- Funkcija malloc vraฤa pokazivaฤ na dodijeljenu memoriju byte_size.
Example: ptr = (int *) malloc (50)
Kada se ova izjava uspjeลกno izvrลกi, rezervira se memorijski prostor od 50 bajtova. Adresa prvog bajta rezerviranog prostora dodjeljuje se pokazivaฤu ptr tipa int.
Razmotrite joลก jedan primjer malloc implementacije:
#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)); } }
Izlaz:
Value of the 6th integer is 480
Primijetite da je koriลกtena sizeof(*ptr) umjesto sizeof(int) kako bi kod bio robusniji kada se deklaracija *ptr kasnije pretvori u drugi tip podataka.
Dodjeljivanje moลพda neฤe uspjeti ako memorija nije dovoljna. U ovom sluฤaju, vraฤa NULL pokazivaฤ. Dakle, trebali biste ukljuฤiti kod za provjeru pokazivaฤa NULL.
Imajte na umu da je alocirana memorija susjedna i moลพe se tretirati kao niz. Moลพemo koristiti pokazivaฤ aritmetiku za pristup elementima polja umjesto koriลกtenja zagrada []. Preporuฤujemo koriลกtenje znaka + za referenciranje elemenata polja jer koriลกtenje inkrementacije ++ ili += mijenja adresu koju pohranjuje pokazivaฤ.
Funkcija Malloc takoฤer se moลพe koristiti sa znakovnim tipom podataka, kao i sa sloลพenim tipovima podataka kao ลกto su strukture.
Zaลกto koristiti malloc() u C-u?
Statiฤki nizovi i obiฤne varijable fiksiraju svoju veliฤinu prilikom kompajliranja programa, ลกto rasipa prostor kada se zahtjev pokaลพe manjim, a potpuno ne uspijeva kada se pokaลพe veฤim. malloc() rjeลกava ovaj problem tako ลกto zahtijeva memoriju tijekom izvoฤenja, tako da program moลพe odrediti veliฤinu meฤuspremnika toฤno prema koliฤini podataka koju prima. Ova fleksibilnost tijekom izvoฤenja je srลพ... dinamiฤka dodjela memorije u C.
Dinamiฤka alokacija s malloc() je pravi izbor u nekoliko uobiฤajenih situacija:
- Koliฤina ulaznih podataka je nepoznata dok se program ne pokrene, kao ลกto je ฤitanje datoteke ili popisa koji je unio korisnik.
- Potrebni su veliki blokovi koji bi prepunili ograniฤeni stog, buduฤi da malloc() crpi iz puno veฤeg heapa.
- Podaci moraju nadลพivjeti funkciju koja ih je stvorila, jer heap memorija traje sve dok se eksplicitno ne oslobodi.
- Strukture i nizovi moraju rasti ili smanjivati โโtijekom izvrลกavanja programa.
Buduฤi da se rezervirani blok vraฤa kao pokazivaฤ, moลพe se jeftino prenositi izmeฤu funkcija bez kopiranja temeljnih podataka.
Kako osloboditi memoriju dodijeljenu pomoฤu malloc()
Memorija rezervirana funkcijom malloc() nalazi se na hrpi i nikada se ne oslobaฤa automatski. Kada program nastavlja alocirati bez oslobaฤanja, polako troลกi svu dostupnu memoriju, ลกto je defekt poznat kao curenje memorije. Funkcija free() vraฤa zavrลกeni blok sustavu tako da se prostor moลพe ponovno upotrijebiti.
Funkcija free() prima jedan argument, pokazivaฤ koji je vratila funkcija malloc(), i odjednom oslobaฤa cijeli blok:
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 */ }
Slijedite ova pravila za sigurno upravljanje dinamiฤkom memorijom:
- Pozovite free() toฤno jednom za svaku uspjeลกnu malloc(); oslobaฤanje istog bloka dva puta uzrokuje nedefinirano ponaลกanje.
- Nakon oslobaฤanja, postavite pokazivaฤ na NULL kako se ne bi mogao ponovno koristiti kao viseฤi pokazivaฤ.
- Nikad ne oslobaฤa() pokazivaฤ koji malloc() nije vratio, ukljuฤujuฤi i onaj pomaknut pokazivaฤkom aritmetikom.
- Uskladi svaku alokaciju s odgovarajuฤim oslobaฤanjem prije nego ลกto pokazivaฤ izaฤe izvan dosega.
Keeping Dodjela i oslobaฤanje u ravnoteลพi je kljuฤna disciplina ruฤnog upravljanja memorijom u C-u i sprjeฤava i curenje i padove uzrokovane ponovnom upotrebom osloboฤene memorije.
malloc() vs. calloc(): Kljuฤne razlike
malloc() i calloc() Oba rezerviraju memoriju hrpe, ali se razlikuju po argumentima i naฤinu na koji tretiraju novi blok. malloc() uzima jedan argument, ukupan broj bajtova, a sadrลพaj ostavlja neinicijaliziranim, pa blok sadrลพi nepredvidive vrijednosti smeฤa dok program ne upiลกe u njega. calloc() uzima dva argumenta, broj elemenata i veliฤinu svakog, te briลกe svaki bajt na nulu prije vraฤanja pokazivaฤa.
Praktiฤne razlike svode se na tri toฤke:
- Inicijalizacija: calloc() poniลกtava memoriju, dok malloc() to ne ฤini, ลกto malloc() ฤini neลกto brลพim kada ฤe vrijednosti ionako biti prepisane.
- Argumenti: piลกete malloc(n * size) ali calloc(n, size) za rezerviranje istog niza.
- Primjer upotrebe: odaberite calloc() kada je bitan ฤist, nulti blok, a malloc() kada je brzina poลพeljna i inicijalizacija se obavlja ruฤno.
Obje funkcije su deklarirane u stdlib.h, obje vraฤaju void pokazivaฤ ili NULL u sluฤaju neuspjeha i obje vraฤaju svoju memoriju istom free() funkcijom.

