Alocarea memoriei malloc () și cache ()

DISTRIBUȚIA MEMORIEI: malloc () și cache ()

Programul dvs. trebuie să furnizeze suficientă memorie pentru a stoca datele utilizate. Unele dintre aceste locații de memorie sunt alocate automat. De exemplu, putem declara







char place [] = "Golful ficatului de porc";

și memorie suficientă va fi alocată pentru a vă aminti această linie.

Sau putem fi mai specifici și să solicităm o anumită cantitate de memorie:

Această descriere alocă 100 de celule de memorie, fiecare dintre acestea fiind proiectată să stocheze o valoare întregă.

Limba C nu se oprește acolo. Acesta vă permite să alocați memorie suplimentară în timp ce programul se execută. Să presupunem, de exemplu, că scrieți un program de dialog și nu știți în avans câte date va trebui să introduceți. Puteți selecta cantitatea de memorie de care aveți nevoie (după cum credeți) și apoi, dacă este necesar, necesită mai mult. În Fig. 15.5 având un exemplu în care se folosește funcția malloc (). să facă exact asta. În plus, observați modul în care un astfel de program utilizează indicii.

/ * adaugă memorie dacă este necesar * /

#define STOP "/ * semnal pentru a opri intrarea * /

#define BLOCK 100 / * octeți de memorie * /

#define LIM 40 / * lungimea maximă a liniei de intrare * /

#define MAX 50 / * numărul maxim de linii de intrare * /

char store [BLOCK]; / * sursă bloc de memorie * /

char symph [LIM]; / * receptor de linii de intrare * /

char * end; / * indică sfârșitul memoriei * /

char * începe [MAX]; / * puncte la începutul liniilor * /

int index = 0; / * numărul de linii de intrare * /

int count; / * contra * /

char * malloc (); / * alocator de memorie * /

end = începe [0] + BLOCK - 1;

pune ("Apel la mai multe orchestre simfonice.");

pune ("Introduceți unul câte unul: apăsați [enter] la început");

pune ("linii pentru a completa lista dvs." Ei bine, sunt gata. ");

în timp ce (strcmp (fgets (symph, LIM, stdin), STOP)! = 0 index

pune ("Așteptați o secundă, voi încerca să găsesc mai multă memorie");

end = începe [index] + BLOCK - 1;

pentru (număr = 0;

strcpy (începe [index], simph);

începe [index + 1] = începe [index] + strlen (simph) + 1;

printf ("Acest .. Continuați dacă vreți.", index);>

pune ("Ei bine, asta am primit:");

pentru (număr = 0;

FIG. 15.5. Un program care adaugă memorie la cerere.

Iată un exemplu de program de lucru:

Denumiți câteva orchestre simfonice.

Introduceți-le una câte una; Apăsați tasta [enter] la începutul

line pentru a completa lista noastră. Bine, sunt gata.

1. Continuați dacă doriți.

Aceasta este 2. Continuați dacă doriți.







Aceasta este 3. Continuați dacă doriți.

Aceasta este 4. Continuați dacă doriți. Simfonia Londrei

Aceasta este 5. Continuați dacă doriți. Filarmonica din Viena

Așteptați o secundă. Voi încerca să găsesc mai multă memorie.

Acesta este 6. Continuați dacă doriți.

Aceasta este 7. Continuați dacă doriți.

Ei bine, iata ce am primit:

Mai intai sa vedem ce face functia malloc (). Este nevoie de un argument sub forma unui număr întreg nesemnat, care reprezintă numărul de octeți de memorie necesari. Deci, malloc (BLOCK) necesită 100 octeți. Funcția returnează un pointer la tipul de caractere de la începutul noului bloc de memorie. Am folosit descrierea

pentru a avertiza compilatorul că malloc () returnează un pointer la char. De aceea, am atribuit valoarea acestui pointer elementului arrayului [index] start folosind operatorul

Acum, să aruncăm o privire la programul de schiță, care este de a stoca toate rândurile originale într-un rând într-o gamă largă de magazine. Vrem să folosim pornirea [0] pentru a se referi la începutul primei linii, a începe [l] - a doua linie, etc. La etapa intermediară, programul introduce un șir în matricea simfonică. Am folosit fgets () în loc de get (). Pentru a limita șirul de intrare la lungimea matricei simfonice.

FIG. 15.6. Linii simfonice consecutive scrise în matricea magazinului.

Înainte de a copia simfolul în magazin. trebuie să verificăm dacă este suficient spațiu pentru ea. Indicatorul final se referă la sfârșitul memoriei, iar valoarea curentă începe [index] se referă la începutul memoriei neutilizate. Deci, putem compara diferența dintre acești doi indicatori cu lungimea unui simf și pentru a determina dacă este suficientă memorie rămasă.

Dacă nu există spațiu suficient, sunați la malloc (). pentru a pregăti o memorie suplimentară. Am setat începe [index] la începutul noului bloc de memorie, și se termină - la sfârșitul noului bloc. Rețineți că nu avem numele acestei noi memorii. Nu este, de exemplu, extensia magazinului. Avem doar denumirile indicatoarelor care se referă la o nouă zonă de memorie.

Când programul se execută, fiecare element al săgeții începe să indice fiecare linie nouă. Unele linii sunt în magazin. altele - în una sau mai multe domenii noi de memorie.

Dar, atâta timp cât avem indicii, putem lucra cu șiruri de caractere, deoarece partea din program care imprimă ne arată.

Acesta este modul în care utilizați malloc (). Dar să presupunem că vrei să lucrezi cu memoria int. dar nu char. De asemenea, puteți folosi malloc () aici. Iată cum se face:

char * malloc (); / * este încă descris ca un pointer pentru a char * /

newmem = (int *) malloc (100); / * utilizați operația de distribuție de tip * /

Sunt necesari încă 100 de octeți. Operația de turnare convertește valoarea returnată de pointer la char. în pointerul de tip int. Dacă, în sistemul nostru, int ocupă doi octeți de memorie, înseamnă că newmem + 1 va crește pointerul cu doi octeți, adică va muta la următorul întreg. Acest lucru înseamnă, de asemenea, că 100 de octeți pot fi utilizați pentru a stoca 50 de numere întregi.

O altă posibilitate de alocare a memoriei ne permite să folosim apelul funcției ().

newmem = (lung *) calloc (100, sizeof (lung));

Ca și malloc (), funcția call () readuce un pointer la char. Trebuie să utilizați un operator de distribuție, dacă doriți să vă amintiți alt tip. Această nouă funcție are două argumente, iar ambele trebuie să fie întregi nesemnate. Primul argument conține numărul de locații de memorie necesare. Al doilea argument este dimensiunea fiecărei celule în octeți. În cazul nostru, utilizează mult timp patru octeți, astfel încât operatorul alocă 100 de octeți patru, folosind un total de 400 de octeți de memorie.

Aplicând dimensiunea (lungă) în loc de 4, am făcut acest program mai mobil. Acesta va funcționa pe sisteme în care lungul are o altă dimensiune decât patru.

Apelul funcției () are încă o funcție; curăță conținutul întregului bloc.

Biblioteca dvs. de limbaj C oferă probabil mai multe funcții de gestionare a memoriei și este posibil să doriți să le testați.

Distribuiți această pagină







Trimiteți-le prietenilor: