Programare C

CUM SĂ UTILIZAȚI FUNCȚIA MALLOC ÎN C

CUM SĂ UTILIZAȚI FUNCȚIA MALLOC ÎN C
Malloc este o funcție încorporată declarată în fișierul antet . Malloc este numele scurt pentru „alocare de memorie” și este utilizat pentru a aloca dinamic un singur bloc mare de memorie contiguă în funcție de dimensiunea specificată. Există două tipuri de alocare de memorie statică și dinamică. Alocarea statică a memoriei se face la momentul compilării și nu se schimbă în timpul rulării. Alocarea dinamică a memoriei alocă memorie în timpul rulării pentru aceasta; folosim malloc. Acum, punctul este de unde provine din această memorie, deci toate cerințele dinamice din C sunt îndeplinite din memoria heap. Practic, aplicația / programul nostru va avea 3 tipuri de memorie

  • Memoria stivă este locală pentru fiecare metodă și, atunci când metoda revine, stiva o șterge automat.
  • Zona de memorie globală alocă memorie pentru toate variabilele globale. Această zonă de memorie este creată la începutul programului și, în cele din urmă, șterge automat zona de memorie.
  • Memoria Heap este întotdeauna un inamic care îndeplinește toate cerințele dinamice ale programului / aplicației. Ori de câte ori vom folosi funcția malloc, va împrumuta niște memorie din grămadă și ne va da indicatorul către ea.

Sintaxă:

Sintaxa lui malloc este (void *) malloc (size_t size). Deci, sintaxa spune că malloc necesită o dimensiune, va returna indicatorul practic un indicator gol și dimensiunea t este definită în ca un număr întreg nesemnat. Funcția Malloc alocă pur și simplu un bloc de memorie în funcție de dimensiunea specificată în heap așa cum puteți vedea în sintaxă că dimensiunea trebuie specificată și, la succes, returnează un pointer care indică primul octet al memoriei alocate altfel returnează NULL. Deci, treaba lui malloc este de a aloca memorie în timpul rulării.

De ce anulați indicatorul:

Malloc nu are o idee despre ce indică; înseamnă pur și simplu că nu știe ce date vor stoca în acea locație de memorie. Alocă doar memoria solicitată de utilizator fără a cunoaște tipul de date care trebuie stocate în memorie. De aceea, returnează un pointer gol.

Malloc doar alocă memorie după aceea este responsabilitatea utilizatorului să tipărească la un tip adecvat, astfel încât să poată fi utilizat corect în program. Pointer pointer este un pointer care poate indica orice tip de date malloc returnează pointer void deoarece nu știe ce tip de date vor fi stocate în memoria respectivă.

Aici solicităm malloc să aloce 6 octeți de memorie acum dacă un malloc de succes va returna un pointer gol. În acest caz, trebuie să îl introducem într-un pointer de tip întreg, deoarece vrem să stocăm un număr întreg în memoria respectivă. Aici malloc alocă 6 octeți de memorie într-o grămadă, iar adresa primului octet este stocată în indicatorul ptr.

Exemplu de program:

Iată un exemplu simplu de program pentru a înțelege conceptul de malloc într-un mod adecvat.

Aici puteți vedea cu funcția printf pe care o cer utilizatorului să introducă numărul de numere întregi. Am declarat două variabile deasupra lui i și n. Variabila n este locul unde vom stoca numărul introdus de utilizator. După aceea, avem funcția malloc; vrem ca malloc să aloce echivalentul de dimensionare cu dimensiunea de n numere întregi. Înmulțim dimensiunea dacă int cu n; acest lucru ne va da dimensiunea de n numere întregi. După aceea, malloc va returna un pointer gol și îl vom tipări la un pointer întreg și stocăm adresa în pointerul ptr. Tipografierea este importantă, deoarece este o bună practică.

Acum, dacă indicatorul conține NULL, înseamnă că memoria nu este disponibilă. Deci, pur și simplu vom ieși din program cu starea de eșec de ieșire. Dacă nu este cazul, putem rula cu ușurință pentru buclă.

Bucla va rula de la 0 la n-1 și îi vom cere utilizatorului să introducă numărul întreg unul câte unul de fiecare dată. În cadrul funcției scanf, există un lucru scris ptr + i, deoarece știm că ptr conține adresa primului octet de memorie. Să presupunem că adresa este 1000 aici i este egal cu zero inițial, deci 1000 + 0 este 1000, așa că în acea adresă primul nostru întreg va fi stocat, apoi după aceea, când devin 1 deci 1000 + 1 care a fost interpretat intern ca (1000) +1 * 4 dacă presupun că dimensiunea întregului este de 4 octeți și ar fi egală cu 1004, deci următorul număr întreg va fi stocat în locația 1004. Și acest lucru va continua în acest fel, adresele sunt ca 1000, 1004, 1008 și așa mai departe. Nu folosim ampersand înainte de ptr + i, deoarece ptr ne oferă deja adresa atunci când scriem ptr, care este pur și simplu un pointer și conține adresa, nu valoarea, deci nu există nicio cerință de a pune ampersand înainte și acest concept ar trebui să fie clar.

Aici, în această buclă, facem pur și simplu un lucru: tipărim toate numerele întregi pe ecran; în mod evident, folosim ptr + i, dar aici, în acest caz, îl dereferențiem deoarece ptr + i reprezintă o adresă, deci trebuie să-l anulăm. Dacă sunt egal cu 0, va fi 1000, deoarece presupunem că prima adresă va fi 1000, deci o dereferențiem; vom obține primul număr întreg atunci i egal cu 1 și va deveni 1001, dar interpretat ca 1004 dacă dimensiunea întregului este 4. Din nou. Îl dereferențiem, așa că ne va da 2nd întreg. În acest fel, totul funcționează.

Deci, acesta este în esență un program simplu care solicită utilizatorilor să introducă n număr întreg și apoi afișăm pur și simplu acele numere întregi pe ecran. După executarea programului, acesta se va afișa.

În primul rând, îi cerem utilizatorului să introducă numărul întreg, apoi utilizatorul introduce numerele întregi și le afișăm pur și simplu pe ecran.

Concluzie:

Nu este nimic în neregulă în programul de mai sus, atâta timp cât îl continuăm o perioadă foarte lungă de timp, împrumutăm memorie din heap, dar nu returnăm niciodată memoria înapoi în heap, se întâmplă doar în cazul în care programul / aplicația au să alergi pentru o perioadă lungă de timp ca 24 de ore. Vor apela din nou funcția malloc și, din nou, asta înseamnă că de fiecare dată când împrumută memorie din grămadă și nu se mai întorc, este o programare proastă, așa că ar trebui să scriem gratuit (adresa memoriei care ar trebui să fie eliberată) înainte de a reveni. Deci, ori de câte ori este important să folosiți malloc free. Deci, folosind malloc, am conservat memoria, iar malloc alocă memorie la fel de mare pe cât o cereți.

Alocare fericită dinamic a memoriei!

Top 5 cărți de captură a jocului
Cu toții am văzut și ne-au plăcut jocurile de streaming pe YouTube. PewDiePie, Jakesepticye și Markiplier sunt doar câțiva dintre cei mai buni jucător...
Cum să dezvolți un joc pe Linux
Acum un deceniu, nu mulți utilizatori de Linux ar fi prezis că sistemul lor de operare preferat va fi într-o zi o platformă populară de jocuri pentru ...
Open Source Ports of Commercial Game Engines
Free, open source and cross-platform game engine recreations can be used to play old as well as some of the fairly recent game titles. This article wi...