Salut, sunt Serban si acesta este al douazecisinoulea tutorial dintr-o suita de tutoriale ale limbajului C++, tutoriale ce le voi face pentru tutorialevideo.info; In acest tutorial vom discuta despre stiva. Probabil v-ati mai intalnit cu aceste doua notiuni, notiunea de stack si notiunea de heap. Ei bine, ele se refera la zone de memorie unde sunt alocate variabilele declarate de catre programator. In continuare le vom explica pe fiecare in parte si vom scoate in evidenta diferentele dintre acestea. Zona de stiva sau de stack este o zona de memorie ce se comporta ca o stiva si este specifica unei functii dintr-un program sau unei metode din cadrul unui obiect. Zona de stiva este zona de memorie ce o primeste o functie atunci cand este creata si contine tipul returnat de acea functie(int, float, char*, etc.), parametrii acelei functii, daca aceasta are bineinteles parametri, dispusi in ordine inversa declararii(de la ultimul la primul) si in continuare variabilele locale declarate in cadrul acelei functii. In momentul in care s-a intrat intr-o functie, se aloca aceasta zona de memorie care la inceput va avea doar ce am mentionat mai devreme(adresa de return si parametrii functiei) pentru ca apoi sa fie populata, partial sau total, de catre variabilele declarate ulterior in functie. Aceasta zona este limitata, deoarece pot exista o multitudine de functii intr-un program. In momentul in care o functie are atatia parametrii incat nu mai pot fi alocati in aceasta zona de stack, atunci se cheama ca avem de-a face cu un Stack Overflow(stiva a dat pe afara) si programul nostru va crapa. Asta se intampla pentru ca incercam sa accesam o zona de de memorie la care nu avem acces in cadrul functiei noastre. Daca totul decurge asa cum trebuie si functia ajunge la final, atunci aceasta zona de stiva nu ii mai este alocata, asa ca toate variabilele din zona de stack vor fi dezalocate(pierdute) si nu ne vom mai putea folosi de ele pe viitor. Din aceasta cauza se spune ca variabilele functiilor traiesc doar in scope-ul functiilor respective. Daca apoi se va apela din nou aceeasi functie, toti pasii de mai devreme se vor relua(o noua zona de stiva alocata functiei, parametriul de return si parametrii functiei, variabile locale, etc.).
#include<iostream>
#include<string>
using namespace std;
//–––––––––––––
// ret_addr; size; start; array[size], p, i
//–––––––––––––
int* stack_function(int start, int size) {
int array[size];
int *p = new int[size];
for(int i = start; i < size; ++i) {
array[i] = i;
p[i] = i;
}
// return array;
return p;
}
int main() {
int *p, start, size;
cout << „Introduceti indexul de start: „;
cin >> start;
cout << „Introduceti dimensiunea vectorului: „;
cin >> size;
p = stack_function(start, size);
cout << „Primul element al vectorului este ” << *p << endl;
cout << „Al doilea element al vectorului este ” << *(p + 1) << endl;
cout << „Al treilea element al vectorului este ” << *(p + 2) << endl;
return 0;
}
NU uitati: cititi si documentati-va in plus, nu parcurgeti _doar_ aceste tutoriale pentru ca nu sunt indeajuns pentru a va dezvolta calitatile de coding, ci sunt doar mici rampe de lansare catre cunoastere. Dupa fiecare tutorial vizionat, abordati subiectul dezbatut in acesta pe net, in cartea `Thinking in C++`, in sectiunea de comentarii.
NU lasati sa treaca pe langa voi o informatie neclara, pentru ca orice farama de cunoastere este importanta.
Pentru mai multe tutoriale video c++ click mai jos.