2014-06-29 8 views
7

OK, ho sentito dire le cose come si deve lanciare un puntatore a un generico uno cioè void * prima di stamparlo e deve mettere in pratica l'uso di %p segnaposto invece di %d nella funzione printf per stamparli.Perché si consiglia di trasmettere un puntatore a un generico prima di stampare?

Ho solo la sensazione che potrebbe essere fatto per prevenire il troncamento di indirizzi di grandi dimensioni durante la stampa o È qualcos'altro? Ma il punto è che se sei su una macchina con puntatori di bit e 32 numeri interi bit; l'utilizzo di %p anziché di %d eseguirà esclusivamente il lavoro.

Qualcuno è a conoscenza di situazioni pratiche in cui questa tecnica di fusione è utile?

+0

puoi dare qualche riferimento – CMPS

+0

@Amir, mi dispiace non ho riferimenti come ho detto ho sentito. – darxtrix

risposta

10

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.

Problemi correlati