Aritmetica de pointeri si accesarea zonelor de memorie heap in C++

2 comments - This post in english

Zonele de memorie heap sunt accesate prin intermediul variabilelor de tip pointer [...]. Acest tip de variabile gestioneaza valori de tip adresa de memorie.
Aritmetica de pointeri [...] presupune utilizarea operatorilor pentru accesarea zonelor de memorie heap. Alocarea zonelor de memorie heap se realizeaza prin functii si/sau operatori implementati la nivel de limbaj de programare.


In programul sursa de mai jos sunt exemplificate in limbajul de programare C++ mecanisme specifice lucrului cu pointeri pe zone de memorie heap. Aplicatia a fost dezvoltata ca solutie Visual Studio 2008, Win32 Console Application.

#include <stdio.h>
#include <string.h>
#include <iostream>
 
using namespace std;
 
void main()
{
 char sir[1000],*psir;
 cout<<"Introduceti sirul de caractere: ";
 gets(sir);
 int dim;
 dim=sizeof(sir);
 cout<<"Dimensiunea zonei de memorie asociata variabilei masiv sir:"\
<<dim<<endl;
 dim=strlen(sir);
 cout<<"Lungimea sirului de caractere introdus:"<<dim<<endl;
 psir=new char [dim+1];
 dim=sizeof(psir);
 cout<<"Dimensiunea zonei de memorie asociata variabilei pointer psir:"\
<<dim<<endl;
 dim=strlen(psir);
 cout<<"Lungimea sirului de caractere alocat in heap:"<<dim<<endl;
 strcpy(psir,sir);
 cout<<"Sirul de caractere copiat in heap:"<<psir<<endl;
 dim=strlen(psir);
 cout<<"Lungimea sirului de caractere copiat in memoria heap:"\
<<dim<<endl;
 
 char *pc;
 pc=psir;
 while(*pc!=0){
  cout<<*pc;
  pc++;
 }
 cout<<endl;
 
 int i;
 do{
  cout<<"Introduceti pozitia simbolului de modificat: ";
  cin>>i;
 }
 while(i<1 || i>dim);
 pc=psir+i-1;
 cout<<"Introduceti simbolul: ";
 cin>>*pc;
 cout<<"Sirul de caractere dupa modificarea simbolului de pe pozitia "\
<<i<<" este:"<<psir<<endl;
 
 delete [] psir;
}

In exemplul de mai sus, variabila sir are rol de buffer pentru stocarea caracterelor introduse de la tastatura. Preluarea sirului de caractere in buffer-ul sir se realizeaza prin intermediul functiei standard gets. Dimensiunea variabilei sir exprimata in numar de octeti este data de numarul maxim de elemente specificat la declararea variabilei, respectiv 1000 de bytes. Dimensiunea variabilei sir exprimata in numar de simboluri ASCII este data de numarul de simboluri introduse de la tastatura, exclusiv terminatorul de sir 0.

Alocarea zonei de memorie heap in care se va stoca sirul de caractere memorat temporar in buffer-ul sir se realizeaza prin intermediul operatorului new. Numarul de elemente de tip char necesar pentru stocarea sirului de simbolurile ASCII este dim+1, unde dim reprezinta numarul de caractere al sirului din buffer. Deoarece terminatorul standard de sir nu este considerat ca parte a sirului de catre functia strlen, este necesar ca spatiul alocat pentru variabila pointer psir sa aiba un element suplimentar de tip char. Daca lungimea zonei de memorie heap se precizeaza ca fiind dim, atunci la momentul dezalocarii cu operatorul delete compilatorul va genera o eroare de executie. Adresa de memorie heap obtinuta prin utilizarea lui new este stocata in variabila pointer psir. Dimensiunea variabilei pointer psir este de 4 bytes (32 biti).

Dupa alocarea zonei de memorie heap, continutul acesteia este reprezentat de valori reziduale. Lungimea zonei de memorie heap exprimata in numar de simboluri ASCII si gestionata prin variabila pointer psir este mai mare decat dim+1 din motive de securitate. Dupa copierea sirului din buffer, zona de memorie cu adresa de inceput in psir are aceeasi lungime (numar de caractere) ca si variabila sir. De asemenea, pe pozitia dim+1 se plaseaza terminatorul standard de sir de caractere.

Traversarea zonei de memorie heap se realizeaza prin variabila pointer pc. Aceasta este initializata cu adresa de inceput a zonei stocata in psir. Continutul aferent unui simbol ASCII cu adresa stocata in pc se acceseaza prin operatorul *, expresia fiind *pc. Aplicatia de mai sus afiseaza sirul de caractere simbol dupa simbol prin trecerea la simbolul urmator folosind operatorul de postincrementare aplicat variabilei pc, respectiv pc++.

Modificarea unui simbol din sirul de caractere stocat in zona de memorie heap presupune:

  • precizarea pozitiei simbolului de modificat;
  • accesarea byte-ului aferent pozitiei prin stocarea adresei acestuia in variabila pointer pc;
  • preluarea de la tastatura a simbolului si suprascrierea directa a zonei de memorie heap aferenta pozitiei de modificat.

Verificarea corectitudinii inlocuirii unui simbol pe o pozitie data se realizeaza prin afisarea sirului de caractere modificat. Aplicatia se incheie prin dezalocarea zonei de memorie heap aferenta vectorului de caractere cu ajutorul operatorului delete.

, , , , , , , , , ,


  1. #1 by Alex B. on March 24th, 2011

    Astept cu interes un tutorial despre vectori de string in C++

(will not be published)

  1. No trackbacks yet.