Der C99-Standard besagt, dass beim Konvertieren eines Ganzzahlwerts 0
in einen Zeiger ein NULL-Zeiger wird. Also ((char*)0)
ist ein NULL-Zeiger. Ein NULL-Zeiger muss keine tatsächliche binäre Darstellung von 0
haben. Es kann zum Beispiel 0x12345678
sein.
Der C-Standard besagt weiterhin, dass wenn Sie einen NULL-Zeiger in eine Integer-Konstante konvertieren, das Ergebnis "implementierungsdefiniert" ist. In Wirklichkeit, was Compiler tun, ist einfach werfen Sie den numerischen Wert des Zeigers auf den entsprechenden ganzzahligen Wert, wie AndreyT sagte. Im obigen Beispiel könnte der Integer-Wert also 0x12345678
sein, obwohl es technisch gesehen alles sein könnte (dh der Compiler darf sagen: "einen NULL-Zeiger zurück in einen ganzzahligen Wert zu konvertieren ergibt den Wert 0xDEADBEEF
"). Beachten Sie, dass dies bedeutet, dass der Compiler selbst bei Plattformen, auf denen der NULL-Zeiger den Wert 0
hat, diesen bei der Konvertierung in einen beliebigen ganzzahligen Wert konvertieren kann. In der Realität tun dies jedoch keine Compiler, weil es ziemlich verrückt wäre.
Also, ja, der C-Standard erlaubt eine Menge Dinge. In Wirklichkeit wird jede Plattform, an der Sie wahrscheinlich arbeiten, einen NULL-Zeiger als 0
darstellen und die Konvertierung eines NULL-Zeigers in einen ganzzahligen Wert ergibt 0
. Suchen Sie here (section 1.14) für eine Liste einiger Ausnahmen von (obskuren) Architekturen, die 0
für einen Nullzeiger nicht verwenden.
Ich verstehe die theoretischen Argumente (die Sie gut erklären), aber ich bin auf der Suche nach Beispielen für tatsächliche Systeme, bei denen das Ausgeben eines Nullzeigers auf eine ganze Zahl in der Praxis zu einem Wert ungleich Null führt. –
@Bruce Christensen: Siehe den Link zu C FAQ in P.S. – AnT
Interessant. Sieht so aus, als ob einige alte Systeme Nicht-Null-Bit-Repräsentationen verwenden, aber es gibt keine modernen Beispiele in den FAQ. Es scheint ziemlich sicher zu sein, dass kein System, auf dem Linux ausgeführt wird, eine Darstellung ungleich Null verwendet oder dass die Implementierung von offsetof() unterbrochen wird (siehe http://google.com/codesearch/p?hl=de#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). –