Warum spinnt mein Compiler eigentlich so rum, wenn ich in C++ einfach nur die Adresse des Nullpointers ausgeben möchte?

...komplette Frage anzeigen

3 Antworten

Der Nullpointer hat keine Adresse -- er ist einfach nur der Wert 0.

Als solcher kann er natürlich Wert jeder Variablen sein, die als Wert eine Adresse enthalten darf.

grtgrt 30.08.2015, 17:47

Bitte zeige uns mal die Zeile, die deinen Ausgabebefehl darstellt (die Zeile also, die der Compiler nicht akzeptiert).

0
Omnivore01 30.08.2015, 21:21

Der Nullpointer hat keine Adresse

Das ist richtig.

er ist einfach nur der Wert 0.

Das ist falsch. NULL zeigt ins Nirvana....nirgendwo hin.....und im nirgendwo kann auch eine 1 stehen. ^^

0
martin7812 31.08.2015, 07:23
@Omnivore01

NULL zeigt ins Nirvana....nirgendwo hin.....und im nirgendwo kann auch eine 1 stehen

In diesem Satz sind gleich zwei Fehler drin:

Erster Fehler:

Unter dem "Wert" eines Zeigers versteht man nicht den Wert, auf den der Zeiger zeigt, sondern die Adresse, auf die der Zeiger zeigt.

So kann der Wert des Zeigers "b" im folgenden Beispiel:

int a = 5;
int *b = &a;

... möglicherweise 0x145308 sein, wenn die Variable "a" an Adresse 0x145308 gespeichert ist. Aber zumindest unter Windows hat "b" niemals den Wert 5, da unter Windows die Variable "a" nicht an Adresse 5 liegen kann. Korrekt ist, dass "b" auf jeden Fall einen Wert 5 zeigt - aber eben nicht den Wert 5 hat.

Zwei Zeiger haben den gleichen Wert, wenn sie auf die gleiche Variable zeigen und nicht, wenn sie auf zwei Variablen mit dem gleichen Wert zeigen.

Und der Nullpointer zeigt nun mal immer auf Adresse 0, weswegen sein Wert 0 ist. Der Nullpointer ist der einzige Zeiger, der diesen Wert hat.

Zweiter Fehler:

Der Wert, auf den der Nullpointer zeigt ist sowohl bei 32-Bit Windows (als auch bei 99,99% aller Linux-Programme) eindeutig:

Die (virtuelle) Adresse 0 ist in der MMU nicht auf eine Hardware-Adresse gemappt. Das bedeutet umgekehrt, dass es keine Adresse im gesamten realen Adressbereich des Rechners gibt, die dem Nullpointer entspricht.

Beim Versuch eines Speicherzugriffs auf so eine Adresse würde eine x86-CPU noch vorher eine Page-Fault-Exception auslösen, da die CPU nicht herausfinden kann, wo denn Adresse 0 überhaupt liegen soll.

Entsprechend kann an dieser Adresse auch nicht "auch eine 1 stehen", wie du schreibst, sondern dort steht tatsächlich gar nichts, da diese Adresse schlichtweg nicht existiert.

1
Omnivore01 31.08.2015, 08:37
@martin7812

Die Zeigerproblematik ist mir wohl bekannt aber danke:

sondern dort steht tatsächlich gar nichts, da diese Adresse schlichtweg nicht existiert.

Und hier gehts ins philosophische! Eine nicht existierende Adresse hat auch keinen Wert! Die logische Null wird in der Schaltungselektronik  mit einigen millivolt definiert. Bei normaler TTL-Logik erkennen Gatter eine null bis ca. 0,7V

Und gar nichts, ist keine logische null. eine logisch null ist klar definiert und hat nichts mit dem NULL-Pointer zu tun!

....aber trotzdem interessant. Ich muss zugeben, dass auch ein Aspekt mir neu war :)

0

wie wärs mit dem code und die zugehörige fehlermeldung?

Was möchtest Du wissen?