Utilizzo di puntatori void su diverse piattaforms

Ho sentito che i puntatori devono essere prima gettato per invalidare per garantire la coerenza dei valori su piattaforms diverse e utilizzare l’ %p formato %p . Perché è e quali sono esattamente i problemi?

 int x=100; int *pi=&x; printf("value of pi is: %p",(void*)pi); 

printf è una funzione variadica e deve essere passato argomenti dei tipi giusti. Lo standard dice che %p prende void * .

Il cast implicito non ha luogo per le funzioni variadiche .

Citando da N1570 7.21.6.1 La funzione fprintf

p: L’argomento deve essere un puntatore a vuoto. Il valore del puntatore viene convertito in una sequenza di caratteri di stampa, in un modo definito dall’implementazione.

La presentazione interna o la dimensione di diversi tipi di puntatore non è necessariamente la stessa.

Ad esempio su un sistema sizeof(void*) può essere 2, ma sizeof(int*) è 1.

Poiché printf è funzione di argomento variabile, non può controllare i tipi di parametri in entrata. Se hai passato int* ad esso, leggerà il numero errato di byte, perché si aspetta void* .

p specifica di conversione p in printf richiede un argomento di tipo void * . C dice che se si passa un argomento di un altro tipo la chiamata richiama un comportamento non definito.

Oltre a ciò, non è richiesto che gli oggetti puntatore di tipi diversi abbiano la stessa rappresentazione: C non garantisce che sizeof (void *) == sizeof (int *) per esempio. C garantisce solo che void * abbia la stessa rappresentazione dei puntatori ai tipi di carattere.