Achtung: Dies ist eine historische Web-Site. Aktuell ist https://rainer.gerhards.net/ (engl) bzw https://www.rainer-gerhards.de/ (deutsch). Alle dynamischen Funktionen, Formulare etc auf dieser Seite sind abgeschaltet.
Datenschutzerklärung Impressum

 
Aug 02, 2017 - 12:36 AM


Select language
Preferred language:


Online
There are 1 unlogged user and 0 registered users online.

You can log-in or register for a user account here.

Anmeldung




 


 Log in Problems?
 New User? Sign Up!



Post new topic   Reply to topic
View previous topic Printable version Log in to check your private messages View next topic
Author Message
rgerhardsOffline
Post subject: Was ist ein Zeiger?  PostPosted: 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.
 
 View user's profile Send private message  
Reply with quote Back to top
rgerhardsOffline
Post subject: Was ist ein Zeiger?  PostPosted: 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?).
 
 View user's profile Send private message  
Reply with quote Back to top
Display posts from previous:     
Jump to:  
All times are GMT + 1 Hour
Post new topic   Reply to topic
View previous topic Printable version Log in to check your private messages View next topic
Powered by PNphpBB2 © 2003-2007 The PNphpBB Group
Credits
:: RSS Feed: ::
Page created in 0.129677057266 seconds.

Ferientips - das Urlaubsweb - Jan Gerhards - Ulrike Gerhards - Ulrike Gerhards Foto Site