Programma:Puntatori e allocazione della memoria in C
int x;
int *y;
int **z;
z = (int **) malloc (sizeof(int *));
y = (int *) malloc (sizeof(int));
x = 1;
*z = &x;
*y = x;
.
.
.
Domanda: Qual è la differenza tra:
*z = &x;
*y = x;
Da quello che ho capito * z indica l'indirizzo di x e * punti y a x, ma per * y puntare a x non richiede l'indirizzo di x? Non capisco veramente cosa stia succedendo con queste due variabili.
Modifica: Voglio anche sapere quando sappiamo quando una variabile è allocata nello stack o nell'heap?
- Perché x, ye z sono allocati nello stack?
- Perché * y, ** y, * z, ** z, allocati nell'heap?
Infine, cambia * z, cambia ** z?
"Da quello che ho capito ..." Hai frainteso. z e y puntano ancora a qualsiasi blocco di memoria a cui hanno indicato quando li hai assegnati. –
Non si dovrebbe eseguire il cast del valore di ritorno di 'malloc()' in C. Ciò aiuterà a identificare il bug di non avere un prototipo per questo. – jxh
Prima di tutto è necessario capire che queste ultime due dichiarazioni sono completamente diverse. Il primo assegna * l'indirizzo * di x a qualsiasi punto z, mentre il secondo assegna il * valore * di x a qualunque cosa y punti. Se assegni un valore, l'originale e la copia diventano "disconnessi" in modo che cambiandone uno non cambi l'altro. Ma quando si usa solo l'indirizzo, i due si uniscono al fianco, cambiandone uno e si cambia l'altro. –