C – Puntatori SizeOf

char c[] = {'a','b','c'}; int* p = &c[0]; printf("%i\n", sizeof(*p)); //Prints out 4 printf("%i\n", sizeof(*c)); //Prints out 1 

Sono estremamente confuso su questa sezione di codice. Entrambi p e c rappresentano l’indirizzo dell’array c al 0 ° indice. Ma perché sizeof (* p) stampa 4? Non dovrebbe essere 1?

Poiché p è di tipo int * , quindi *p è di tipo int , che è apparentemente largo 4 byte sulla tua implementazione.


E usa %zu per stampare size_t (quale dimensione dei rendimenti) se non vuoi che il tuo programma invochi un comportamento indefinito.

sizeof(*p) è la dimensione dell’object int a cui p fa riferimento.

sizeof (* p) stamperà la dimensione di p che è 4 a causa di int ma c è di char, ecco perché è 1

In C (non C99) l’operatore sizeof è strettamente un calcolo del tempo di compilazione. così quando viene valutato sizeof (*p) [un ptr dereferenziato a un intero], la dimensione di int è quattro.

Nota. la parte (*p) di tale affermazione è un operatore “cast”. Quindi, sizeof NON è una chiamata di funzione come in sizeof(xyz) , piuttosto è come sizeof var_name o sizeof (int *) .

Quando viene eseguito il programma, cambia l’object puntato da p, ma il valore di sizeof (*p) era già calcolato e codificato nel modulo di caricamento eseguibile.

Penso che la tua confusione sia che stavi pensando che C avrebbe capito a che tipo di dati stava puntando quando il tuo programma è in esecuzione.