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: