nikpez di nikpez
Ominide 738 punti

Allocazione dinamica - Funzioni

Esercizio

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

[code]char * funz ()
{
char str[80];
char * p;
gets(str);
p=new char [strlen(str)+1];
strcpy(p,str);
return p;
}

int main()
{
char *p;
p=funz();
…..
delete [] p;
}
[/code]


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!!!
}


Vettori di puntatori

char * mesi[12]; //vettore di puntatori
Allocazione dinamica delle stringhe contenenti i mesi.

char mese[10];
int i;

for(i=0; i<12; i++)
{
gets(mese);
*(mesi+i)= new char[strlen(mese)+1]; // = mesi[ i ] = …..
strcpy(*(mesi+i),mese);
}
for(i=0; i<12; 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

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

Registrati via email