Author |
Message |
rgerhards
|
|
Post subject: Was ist ein Zeiger?
Posted: Feb 26, 2009 - 10:15 AM
|
|
Joined: Sep 25, 2006
Posts: 688
Status: Offline
|
|
Diese Erklärung ist aus dem Kontext entstanden, dass es darum ging, wie man einen "leeren Zeiger" anwenden kann. Ich habe es aber archiviert, da ich denke, es ist auch generell ganz gut brauchbar...
Ein Zeiger selbst stellt keinen Speicher für die Datenstruktur zur Verfügung, auf die er zeigt. Wenn man dieser Datenstruktur "irgendwas" machen möchte, dann muss man erst einmal sicher stellen, dass überhaupt Speicher da ist, d.h,. der Zeiger a) auf solchen Speicher zeigt und b) der Speicher auch verwendbar ist, d.h. nicht durch etwas anderes belegt.
Nehmen wir einmal an Hilfszeig (eine Zeigervariable) würde auf freien Speicher zeigen (weil gerade zugeordnet), dann kann das Beispielkonstrukt evtl. funktionieren (ich habe das nicht geprüft, weil es ja eigentlich irrelevant ist).
Wenn aber nun Hilfszeig auf nil zeigt, dann existiert gar kein Speicher für die Datenstruktur. Das Programm stürzt mit eine Speicherschutzverletzung ab. Hat Hilfszeig einen Wert, der (zufälligerweise) auf eine Listenstruktur zeigt, dann wird *diese* andere Listenstruktur verändert (z.B. der Ankerzeiger). Das Programm arbeitet bestenfalls nicht mehr ganz korrekt, und kann insgesamt die merkwürdigstens Verhalten zeigen. Hat Hilfszeig irgendeinen Wert, der auf keinerlei gültigen Speicher zeigt, dann stürzt das Programm wieder mit einer Speicherschutzverletzung ab. Zeigt Hilfszweig genau auf die richtige Datenstruktur und ist diese zufälligerweise noch nicht benutzt, dann kann das Programm funktionieren (vermutlich hat man dann aber ein sogennanten "Memory Leak" und das Gesamtprogramm arbeitet auch nicht korrekt).
Fazit: Ein Zeiger impliziert keinesfalls, dass auch irgend etwas da ist, auf das er gültig zeigen kann.
Analogie mit Girokontonummer
Ein Beispiel aus dem realen Leben: Eine Kontonummer ist ein Zeiger. Sie zeigt auf ein Konto, hinter dem sich Geld eines bestimmten Menschen verbirgt. Wenn ich etwas überweisen möchte, muss (sollte;)) ich meine Kontonummer angeben. Nur dann zeigt sie auf das korrekte Objekt und alles klappt. Gebe ich nun eine Zufallszahlenfolge an (das ist der uninitialisierte Zeiger), dann kann mehrerlei passieren: a) zufälligerweise "treffe" ich meine Kontonummer und alles klappt, das ist der Fall oben mit dem freien Speicherbereich, b) ich schreibe eine gänzlich ungültige Kontonummer (wird an der Prüfsumme erkannt) und die Bank lehnt die
Überweisung ab, das ist der Fall mit der Speicherschutzverletzung oder c)
ich treffe zufälligerweise die Kontonummer von jemand anderem, dann wird die Überweisung wahrscheinlich zuerst ausgeführt, aber nachher gibt es Ärger - das ist der verbleibende Fall im obigen Beispiel.
Die Wahrscheinlichkeit, dass ich zufällig die richtige Kontonummer (also meine) angebe, ist sehr gering. Ähnlich gering ist die Wahrscheinlichkeit, dass ein Zeiger zufällig auf ein geeignetes Objekt zeigt.
Merke: genau so wenig wie eine beliebige Kontonummer irgendjemandes Geld zwingend exkat referenziert, genau so wenig referenziert ein beliebiger Zeiger zwingend irgend ein geeignetes Objekt. |
|
|
|
|
|
rgerhards
|
|
Post subject: Was ist ein Zeiger?
Posted: Feb 26, 2009 - 11:24 AM
|
|
Joined: Sep 25, 2006
Posts: 688
Status: Offline
|
|
Nachtrag: In meiner Analogie, fällt mir auf, fehlt noch etwas. Wenn bei der Überweisung keine Kontonummer angegeben wird, kommt sie auch zurück, ohne das die Bank die Überweisung ausführt (wie auch?). Das entspricht dem Fall, wenn der Zeiger den Wert nil hat. Das "wie auch?" ist auch hier die absolut korrekte Beschreibung des Problems (wie auch soll der Zeiger dereferenziert werden, wenn er auf kein Objekt zeigt?). |
|
|
|
|
|
|
|