Poiché la specifica dello specificatore %p
è che stampa uno void *
. Non sa come stampare qualsiasi altro tipo di puntatore.
Con printf
il chiamante deve convertire l'argomento nel tipo corretto; la funzione printf
non può eseguire conversioni perché non ha accesso alle informazioni sul tipo su quali argomenti è effettivamente passato. Può solo presupporre che tu abbia passato quelle giuste.
C99 7.19.6.1 # 7
p L'argomento deve essere un puntatore a vuoto. Il valore del puntatore è convertito in una sequenza di caratteri di stampa, in un modo definito dall'implementazione.
C99 7.19.6.1 # 9
Se uno degli argomenti non è del tipo corretto per la specifica di conversione corrispondente, il comportamento è indefinito.
"Comportamento non definito" significa che può succedere di tutto. In pratica, è probabile che se ne vada via se il puntatore che si passa ha le stesse dimensioni e la stessa rappresentazione di void *
. Ma non dovresti fare affidamento su un comportamento indefinito.
Sui sistemi moderni, tutti i puntatori di oggetti (cioè non i puntatori di funzione) hanno la stessa dimensione e rappresentazione. Se sai di essere su un sistema del genere, e non è molto importante se il programma si comporta male, allora probabilmente vai via con il passare il tipo di puntatore sbagliato.
Un posto in cui sarebbe importante se si tenta di stampare un puntatore a funzione; poiché esistono sistemi moderni che hanno puntatori di funzioni di dimensioni diverse rispetto ai puntatori di oggetti. Non è garantito che la trasmissione di un puntatore a void *
sarà consentita dal compilatore, ma almeno si otterrà un messaggio di errore del compilatore quando lo si prova.
fonte
2014-06-29 06:09:10
puoi dare qualche riferimento – CMPS
@Amir, mi dispiace non ho riferimenti come ho detto ho sentito. – darxtrix