Arrayuri de lungime arbitrară și alocare dinamică a memoriei pe stivă

Arrayuri de lungime arbitrară și alocare dinamică a memoriei pe stivă

În C90, nu este posibil să se creeze o matrice de lungime arbitrară. Dimensiunea matricei trebuie să fie cunoscută la momentul compilării







În standardul C99, a devenit posibilă crearea de rețele, a căror dimensiune nu este cunoscută la momentul compilării. De exemplu, puteți trece funcțiile dimensiunii matricei și puteți crea o matrice temporară

Arhitecturile de lungime arbitrară nu pot fi inițializate atunci când sunt create. De exemplu, codul următor nu este compilat

Acest lucru se face (aparent) din motive de securitate. Dacă trebuie să umpleți o matrice cu valori, puteți face acest element cu element sau, de exemplu, utilizând funcția memset.

Cu toate acestea, VSE nu susține această inovație și nu va continua.

Cum pot crea dinamic o serie de dimensiuni arbitrare pe stivă? Evident, avem nevoie de o funcție care să ne permită să alocăm memoria pe stivă. Această funcție se numește alloca sau _alloca și este definită în biblioteca malloc.h

(Aici și mai jos, funcțiile non-standard sunt precedate de o subliniere.) În versiunile GNU de compilatoare, aceasta nu există). Deoarece memoria este alocată pe stivă, nu este nevoie să o curățați - după ieșirea din funcțiune, stiva va fi restabilită și variabilele locale "distruse". În plus, alocarea memoriei este foarte rapidă (mai multe ordine de mărime mai rapidă decât alocarea pe heap) și nu duce la fragmentare.







Dar aici apare aceeași problemă ca și în cazul matricelor de lungime arbitrară - dacă alocați prea multă memorie, stiva va depăși. Funcția _alloca, spre deosebire de malloc, nu returnează NULL dacă nu ar putea aloca memorie, ci creează o excepție de suprapunere de stivă structurată. De exemplu, sunați

Prin urmare, această metodă de izolare

Nu prea frumos. Eliberarea memoriei apare numai după ieșirea din funcție, și nu după depășirea limitelor de vizibilitate. Funcția _alloca a fost dezactivată ulterior și înlocuită cu funcția _malloca. Diferă prin faptul că mai întâi încearcă să aloce spațiu pe stivă și dacă nu ar putea face acest lucru, el alocă spațiu pe heap, adică funcționează ca malloc. Cu toate acestea, dacă memoria poate fi alocată pe o grămadă, atunci va trebui să fie eliberată după ea însăși. Pentru aceasta, utilizați funcția _freea. Dacă memoria a fost alocată pe stivă, atunci funcția nu face nimic. Dacă memoria a fost alocată pe heap, _freea o eliberează ca standard liberă. Acesta este prețul pentru o utilizare mai sigură.

malloca în cazul alocării memoriei pe heap se comportă ca malloc. Adică, dacă memoria nu ar putea fi alocată pe heap, atunci NULL va fi returnată.

NOTĂ: _malloca va aloca memorie pe stivă numai în lansare. În versiunea de depanare a proiectului, memoria este întotdeauna alocată pe heap.

ru-Cyrl 18- tutorial Sypachev S.S. 1989-04-14 [email protected] Ștefan Șpașev studenți







Articole similare

Trimiteți-le prietenilor: