Funcții de distribuție dinamică

Indicatorii sunt utilizați pentru a aloca dinamic memoria calculatorului pentru stocarea datelor. Alocarea dinamică înseamnă că programul alocă memoria pentru date în timpul execuției. Memoria pentru variabilele globale este alocată la timpul de compilare, iar pentru variabilele locale non-statice - în stivă. În timpul executării programului, nici variabilele globale sau locale nu pot fi alocate o memorie suplimentară. Dar destul de des apare o astfel de necesitate și cantitatea de memorie necesară nu este cunoscută în prealabil. Acest lucru se întâmplă, de exemplu, atunci când se utilizează structuri de date dinamice, cum ar fi listele legate sau arborii binari. Astfel de structuri de date sunt extinse sau reduse atunci când programul este rulat după cum este necesar. Pentru a implementa astfel de structuri, programul are nevoie de instrumente care să poată aloca și elibera memoria pentru ele, dacă este necesar.







Memoria alocată în C cu funcțiile de distribuție dinamică a datelor se află în așa-numita. dinamic alocat spațiului de memorie (heap) [1]. Dynamically alocă zona de memorie - este o zonă de memorie liberă nu este utilizat de program, sistemul de operare sau alte programe. Mărimea zonei heap nu este cunoscută dinainte, dar, de regulă există suficientă memorie pentru a se potrivi datele programului. Cele mai multe compilatoare suporta funcții de bibliotecă pentru a obține dimensiunea actuală a zonelor de memorie alocate dinamic, dar aceste funcții nu sunt definite în standardul C. Deși dimensiunea zonei heap este foarte mare, dar este finit și poate fi epuizat.

Baza sistemului de alocare dinamică din C este funcțiile malloc () și free (). Aceste funcții colaborează. Funcția malloc () alocă memoria, iar free () - o eliberează. Acest lucru înseamnă că, pentru orice funcție cerere malloc () alocă locația de memorie liber necesar, un drum liber () îl eliberează, care este, se întoarce sistemul. Un program care utilizează aceste funcții trebuie să includă un fișier antet .

Prototipul lui malloc () este:

Aici, numărul de octeți este dimensiunea memoriei necesare pentru plasarea datelor. (Tipul Size_t este definit în ca o întreagă nesemnată.) Funcția malloc () returnează un pointer de tip void *. astfel încât să îl puteți atribui oricărui tip de pointer. Dacă este reușit, malloc () returnează un pointer la primul octet al porțiunii contigue din memorie alocată în zona de memorie alocată dinamic. Dacă nu există suficientă memorie liberă în zona de memorie alocată dinamic pentru a executa interogarea, memoria nu este alocată, iar malloc () revine la zero.







La executarea următorului fragment de program, se alocă o secțiune de memorie limitată de 1000 de octeți:

După atribuire, indicatorul p se referă la primul dintre cei 1000 de octeți ai memoriei alocate.

Următorul exemplu alocă memoria pentru 50 de numere întregi. Pentru a mări mobilitatea (portabilitatea programului de la o mașină la alta), se folosește dimensiunea operatorului.

Deoarece zona de memorie alocată dinamic nu este infinită, de fiecare dată când sunt plasate datele, este necesar să se verifice dacă a avut loc. Dacă malloc () nu poate aloca memoria necesară din nici un motiv, ea revine la zero. Următorul exemplu arată cum se realizează succesul unui control de plasare:

Desigur, în loc să ieșiți din programul de ieșire (), puteți pune orice instrument de eroare. Obligatoriu aici se poate numi doar cerința de a nu utiliza pointerul p. dacă este zero.

Funcția free () este opusă funcției malloc () în sensul că returnează sistemului o porțiune din memoria atribuită anterior folosind funcția malloc (). Cu alte cuvinte, eliberează memoria care poate fi refolosită de funcția malloc (). Funcția free () are următorul prototip:

Aici, p este un pointer la secțiunea de memorie alocată înaintea acestei funcții malloc (). Funcția free () nu poate fi apelată cu un argument nevalid, distrugând instantaneu întregul sistem de alocare a memoriei.

Subsistemul de alocare dinamică din C este utilizat împreună cu pointerii pentru a crea diferite construcții software, cum ar fi listele legate și copacii binari. Mai multe exemple de utilizare a unor astfel de structuri sunt prezentate în partea IV. Aici este luată în considerare o altă aplicație importantă de alocare dinamică: plasarea matricelor.

Alocarea dinamică a memoriei pentru tablouri

Destul de des este nevoie să alocați dinamic memoria utilizând malloc (). dar lucrul cu această memorie este mai convenabil ca și cum ar fi o matrice care poate fi indexată. În acest caz, trebuie să creați o matrice dinamică. Nu este greu să faci acest lucru, deoarece fiecare pointer poate fi indexat ca o matrice. În următorul exemplu, o matrice dinamică unidimensională conține un șir:

Înainte de a utiliza s pentru prima dată, programul verifică dacă distribuirea memoriei a avut succes. Această verificare este necesară pentru a preveni utilizarea accidentală a indicatorului nul. Rețineți că pointerul s este utilizat în funcția get (). precum și atunci când este afișat (dar de această dată ca o matrice obișnuită).

De asemenea, puteți aloca dinamic memoria pentru o matrice multidimensională. Pentru a face acest lucru, trebuie să declarați un pointer care definește totul, cu excepția dimensiunii stângi a matricei. În următorul exemplu [2], o matrice dinamică bidimensională conține o tabelă cu numere de la 1 la 10 în puteri de 1, 2, 3 și 4.

Programul afișează următoarele:

Indicatorul p din programul principal (principal ()) este declarat ca

Așa cum am menționat mai devreme, în C ++ trebuie să convertiți explicit tipurile de indicatori. Prin urmare, pentru ca acest program să fie corect atât în ​​C, cât și în C ++, este necesar să se distribuie în mod explicit tipul valorii returnate de funcția malloc (). Pentru aceasta, linia în care indicatorul p este atribuit acestei valori trebuie să fie rescris după cum urmează:

Mulți programatori utilizează conversia explicită a tipurilor de indicatori pentru a asigura compatibilitatea cu C ++.

[1] Alte nume sunt de asemenea folosite: zona dinamică. dinamic alocat. buchet. matrice neordonată (date).







Articole similare

Trimiteți-le prietenilor: