ho pensato che in gcc, void * e char * sono trattati allo stesso modo quando si tratta di puntatori, ossia void * "punti" ad un unico byte di memoria, quindi il seguente codiceC puntatore nullo aritmetica
void *p;
p = malloc(sizeof(void));
printf("%p %p\n",p,p+1);
restituisce effettivamente 0x984a008 0x984a009
. Analogamente, nulli punti ** ad un puntatore, quindi un incremento in un modo veramente un incremento di 4 byte (su un sistema operativo a 32 bit), cioè
void **p;
p = (void **) malloc(sizeof(void *));
printf("%p %p\n",p,p+1);
rendimenti 0x984a008 0x984a00c
. Tuttavia, il seguente codice mi confonde
void **p, *p1;
p = (void **) malloc(sizeof(void *));
p1 = (void **) p;
printf("%p %p\n",p1,p1+1);
Dal momento che ritorna di nuovo 0x984a008 0x984a009
. Che cosa sta succedendo qui?
Forse volevi dire a digitare 'vuoto ** p, p1 **;' invece di 'void ** p, * p1;'? –
'sizeof (void)' è 1 o almeno dà un avvertimento, è inutile. Non lo fai. Cosa indica un tipo 'vuoto? c'è solo 'void *'. –
volevo dire vuoto ** p, * p1. So che questo codice viene compilato, cosa non capisco, perché se p è stato originariamente dichiarato come void **, p + 1 corrisponde a un incremento di 4 byte, mentre se p1 è dichiarato void * e successivamente rieletto come void **, l'aritmetica aggiunge solo 1 byte per p1 + 1 – Ivan