Bene, come sapete, la rappresentazione fisica del puntatore nullo di un dato tipo non è necessariamente un pattern a bit a zero. Quando si converte forzatamente un valore di un puntatore (qualsiasi puntatore) in un tipo intero, il risultato è definito dall'implementazione, ma normalmente (e questo è l'intento) il valore numerico del puntatore - l'indirizzo numerico - rimane invariato, se possibile. Ciò significa che se su una determinata piattaforma un puntatore nullo di tipo char *
è rappresentato dal modello 0xBAADF00D
(ad esempio), l'espressione sopra verrà valutata a 0xBAADF00D
e non a zero. Certo, per quello avresti bisogno di una piattaforma con puntatori nulli non nulli. Personalmente non ho mai lavorato con tali piattaforme, anche se ho sentito parlare di un numero di piattaforme reali come quelle là fuori (come nel regno delle piattaforme embedded non è qualcosa di insolito).
Inoltre, come una nota aggiuntiva, i valori nulli di puntatore di tipo diverso possono avere diverse rappresentazioni fisiche, il che significa che, in teoria, è possibile ottenere valori diversi da (size_t) ((int *) 0)
, (size_t) ((char *) 0)
e (size_t) ((double *) 0)
. Ma sarebbe una situazione piuttosto esotica, anche se perfettamente possibile dal punto di vista del linguaggio C astratto.
P.S. Leggi here (FAQ C) per alcuni esempi di piattaforme effettive con puntatori nulli diversi da zero.
Capisco gli argomenti teorici (che spiegate bene), ma sto cercando esempi di sistemi reali in cui il cast di un puntatore nullo a un intero risulta in un valore diverso da zero in pratica. –
@Bruce Christensen: vedere il collegamento alle domande frequenti in C in P.S. – AnT
Interessante. Sembra che alcuni sistemi antichi usino rappresentazioni a bit non zero, ma non ci sono esempi moderni nelle FAQ. Sembra abbastanza certo che nessun sistema su cui Linux gira usa una rappresentazione diversa da zero, o la sua implementazione offsetof() si romperebbe (vedi http://google.com/codesearch/p?hl=it#huut-anHVuo/anonymous/kernel /v2.6/linux-2.6.20.tar.bz2%7CqE0cR-WvTpY/linux-2.6.20/include/linux/stddef.h&q=stddef.h%20linux-2.6). –