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.

  • ๐Ÿง  Dodjela vremena izvoฤ‘enja: malloc() rezervira memoriju tijekom izvrลกavanja kada potrebna veliฤina nije poznata u vrijeme kompajliranja.
  • ???? Sintaksa: Pokazivaฤ tipa cast prima malloc(byte_size), obiฤno veliฤine sizeof radi prenosivosti.
  • โš ๏ธ NULL provjera: Neuspjeli zahtjev vraฤ‡a NULL pokazivaฤ, stoga provjerite rezultat prije dereferenciranja.
  • โž• Aritmetika pokazivaฤa: Blok je susjedni, pa koristite + umjesto ++ za dosezanje elemenata niza.
  • ๐Ÿงน Oslobodite memoriju: Otpustite svaki blok pomoฤ‡u free() kako biste sprijeฤili curenje memorije i viseฤ‡e pokazivaฤe.
  • ๐Ÿค– AI pomoฤ‡: AI asistenti i GitHub Copilot izraฤ‘uju pozive funkcije malloc() i oznaฤavaju nedostajuฤ‡e naredbe free().

Funkcija malloc() u C-u

ล 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.

ล to je malloc u C

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.

Pitanja i odgovori

U C-u, pretvaraฤ je opcionalan i ฤesto se ne preporuฤuje jer void* automatski pretvara u bilo koji pokazivaฤ objekta, a eksplicitni pretvaraฤ moลพe maskirati nedostajuฤ‡i stdlib.h include. U C++, meฤ‘utim, glumaฤka postava je obavezna.

NULL povrat znaฤi da zahtjev nije uspio, obiฤno zbog nedovoljne memorije. Uvijek provjerite pokazivaฤ prije koriลกtenja, jer dereferenciranje NULL-a dovodi do nedefiniranog ponaลกanja i obiฤno ruลกi program.

realloc() mijenja veliฤinu bloka koji je prethodno rezervirao malloc(), keeping postojeฤ‡e podatke do manje veliฤine. Ako ne uspije, vraฤ‡a NULL i ostavlja izvorni blok netaknutim, pa prvo dodijelite njegov rezultat privremenom pokazivaฤu.

Do curenja memorije dolazi kada se memorija iz malloc() nikada ne oslobodi pomoฤ‡u free(). Program stalno rezervira prostor koji viลกe ne koristi, ลกto postupno moลพe iscrpiti memoriju koja mu je dostupna.

malloc() rezervira memoriju na heapu, a ne na stogu. Heap blokovi ostaju valjani dok ne pozovete free(), tako da mogu nadลพivjeti funkciju koja ih je stvorila, za razliku od automatskih varijabli stoga koje nestaju pri povratku.

malloc() je biblioteฤna funkcija koja vraฤ‡a void* i treba joj sizeof za izraฤunavanje bajtova. C++ new je operator koji vraฤ‡a tipizirani pokazivaฤ i poziva konstruktore. Uparite malloc() s free(), a new s delete.

Da. Pomoฤ‡nici u AI kodiranju izraฤ‘uju pozive malloc(), umeฤ‡u NULL provjere i oznaฤavaju nedostajuฤ‡e pozive free() ili propuลกtanja, a mogu objasniti i aritmetiku pokazivaฤa. Uvijek kompajlirajte i testirajte generirani kod prije nego ลกto mu vjerujete.

GitHub kopilot predlaลพe malloc(), sizeof() i odgovarajuฤ‡e free() retke iz komentara koji opisuje vaลกu namjeru. RevPrije kompajliranja pogledajte svaki prijedlog za nedostajuฤ‡e NULL provjere i propuลกtanja.

Saลพmite ovu objavu uz: