Concetti Chiave

  • La funzione 'funz' alloca dinamicamente una stringa nello heap e restituisce un puntatore ad essa, garantendo la disponibilità della stringa anche dopo la fine della funzione.
  • I puntatori di puntatori consentono di gestire indirizzi di variabili puntatore, permettendo una maggiore flessibilità nella manipolazione della memoria.
  • È importante allocare memoria per i puntatori prima di utilizzarli, altrimenti si rischia di accedere a zone di memoria non allocate e causare errori nel programma.
  • L'allocazione dinamica permette di ottimizzare l'uso della memoria, specialmente quando si gestiscono array di puntatori come nel caso dei mesi dell'anno.
  • Il codice fornisce esempi di calcolo dello spazio occupato in memoria, evidenziando differenze tra la dimensione dell'array di puntatori e le singole stringhe allocate.

Allocazione dinamica della stringa

Scrivi una funzione che legga una stringa, la allochi nello HEAP e faccia in modo che essa sia ancora disponibile al termine della funzione.

char * funz ()
[/p]
[p]
{
[/p]
[p]
char str[80];
[/p]
[p]
char * p;
[/p]
[p]
gets(str);
[/p]
[p]
p=new char [strlen(str)+1];
[/p]
[p]
strcpy(p,str);
[/p]
[p]
return p;
[/p]
[p]
}
[/p]
[p]
int main()
[/p]
[p]
{
[/p]
[p]
char *p;
[/p]
[p]
p=funz();
[/p]
[p]
…..
[/p]
[p]
delete [] p;
[/p]
[p]
}
[/p]
[p]

Puntatori e loro utilizzo

Un puntatore di puntatore è una variabile abilitata a mantenere l’indirizzo di una variabile puntatore.

int **ppi;

int a = 3;

int *pi;

pi = &a;

ppi = π

printf(“%d”,**ppi);

Puntatori

L-value: è l’indirizzo di memoria di un elemento

R-value: è il valore memorizzato all’L-value.
Un errore frequente

int main()

{

int x, *p;

x = 10;

*p = x; //NO: non ho allocato l’area!!!

}

char * mesi[12]; //vettore di puntatori

Allocazione dinamica delle stringhe contenenti i mesi.

char mese[10];

int i;

for(i=0; i

{

gets(mese);

*(mesi+i)= new char[strlen(mese)+1]; // = mesi[ i ] = …..

strcpy(*(mesi+i),mese);

}

for(i=0; i

printf("%s\n",mesi);

Vantaggio: miglior sfruttamento della memoria , ho però lo spazio occupato dal vettore di puntatori.

N.B. char **punt=mesi;

Spazio di memoria occupato

Spazio di memoria occupato

char * mesi[] ={ "Gennaio","Febbraio","Marzo","Aprile","Maggio",

"Giugno","Luglio","Agosto","Settembre","Ottobre",

"Novembre","Dicembre"}; //solo in fase di inizializzazione

printf("%d\n",sizeof(mesi)); //48 byte

printf("%d\n",sizeof(mesi[2])); //4 byte

printf("%d\n",sizeof(*mesi[2])); //1 byte

printf("%d\n",strlen(mesi[2])); //5 byte

Domande da interrogazione

  1. Qual è il metodo per allocare dinamicamente una stringa in C++?
  2. Per allocare dinamicamente una stringa in C++, si utilizza l'operatore `new` per creare un array di caratteri, come mostrato nella funzione `funz()`, dove si alloca memoria in HEAP e si copia la stringa letta.

  3. Cosa sono l'L-value e l'R-value in C?
  4. L-value è l'indirizzo di memoria di un elemento, mentre R-value è il valore memorizzato all'L-value. Questo è importante per evitare errori, come nel caso in cui si tenta di dereferenziare un puntatore non allocato.

  5. Qual è il vantaggio dell'allocazione dinamica delle stringhe in un array di puntatori?
  6. L'allocazione dinamica delle stringhe in un array di puntatori consente un miglior sfruttamento della memoria, poiché si allocano solo le stringhe necessarie, ma richiede anche di gestire lo spazio occupato dal vettore di puntatori.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community