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.


