Puntatori

di il
6 risposte

Puntatori

Salve,
ho una domanda su questo codice:
int main()
{
const int dim = 10;
int i, a[dim], *b;
b = (int *)MyMalloc(dim*sizeof(int));
printf(“\n indirizzo di a : %x", &a);
printf(“\n indirizzo di a[0] : %x",&a[0]);
printf(“\n Dimensione di a : %d bytes", sizeof(a));
printf(“\n Indirizzo di b : %x", &b);
printf(“\n Indirizzo di b[0] : %x", &b[0]);
printf(“\n Dimensione di b : %d bytes", sizeof(b));
free(b);
return 0;
}

l'outup:
indirizzo di a : F2FFD10
indirizzo di a[0] : F2FFD10
Dimensione di a : 40 bytes
Indirizzo di b : F2FFD58
Indirizzo di b[0] : 1E90010
Dimensione di b : 8 bytes


le prime tre righe hanno senso: indirizzo di a[0] coincide con quello di a, le dimensioni sono 10*4 bytes= 40bytes;
perchè invece b e b[0] hanno indirizzo diverso? perchè b ha 8 bytes?

6 Risposte

  • Re: Puntatori

    Posta il codice della myMalloc ()
  • Re: Puntatori

    La MyAlloc non c'entra ...

    La differenza sta nel fatto che a è un vettore mentre b è un puntatore.

    Il fatto che il nome di un vettore rappresenti il puntatore al suo primo elemento non vuol dire che a è un puntatore. E' una cosa comunque diversa.

    Per capirci, a rappresenta uno spazio di un certo numero di interi in memoria. Esiste lo spazio associato ad a ma a non esiste "come puntatore a sé stante".

    Nell'altro caso, esiste sia lo spazio per il puntatore b sia lo spazio puntato dal puntatore b.
    Quindi b (come puntatore effettivamente esistente in memoria) ha un suo indirizzo diverso dal primo elemento a cui punta.

    La dimensione di b è quella della dimensione di un puntatore nel tuo sistema (8 byte = 64 bit)
  • Re: Puntatori

    La spiegazione sta nei dettagli :

    1) il vettore a e' allocato nel punto in cui viene dichiarato (nello stack): tutta la memoria si trova li!

    quindi a e &a[0] fanno riferimento allo stesso indirizzo di memoria.

    2) b e' un puntatore: e' allocato sull stack, ma ha spazio solo per un indirizzi di memoria.

    La memoria puntata da b e' stata allocata nello heap attraverso la malloc. Quindi &b[0] e' l'indirizzo di memoria nello heap della memoria allocata ed e' uguale al valore di b.
  • Re: Puntatori

    Ovviamente, anche se l'heap non è coinvolto, vale tutto quello che ti ho cercato di spiegare come, ad esempio, in questo codice
    
       const int dim = 10;
    	int a[dim];
    	int *b;
    
    	b = a;
    
    	printf("\n indirizzo di a : %x", &a);
    	printf("\n indirizzo di a[0] : %x",&a[0]);
    	printf("\n Dimensione di a : %d bytes", sizeof(a));
    	printf("\n Indirizzo di b : %x", &b);
    	printf("\n Indirizzo di b[0] : %x", &(b[0]));
    	printf("\n Dimensione di b : %d bytes", sizeof(b));
    
  • Re: Puntatori

    Grazie ragazzi, siete grandi... solo un dettaglio: perchè 8 byte? non dovrebbe essere 4?
  • Re: Puntatori

    4 byte per i puntatori a 32 bit, si vede che stai usando un puntatore a 64 bit
Devi accedere o registrarti per scrivere nel forum
6 risposte