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

 
01.08.2017, 22:49 Uhr
Hauptmenü
|--> Infos
|--> Forum
|--> Fotos


Sprachwahl
Sprache auswählen:




Online
Aktuell 1 Gast und 0 registrierte Benutzer online.

Anmeldung

Anmeldung




 





Neues Thema eröffnen   Neue Antwort erstellen
Vorheriges Thema anzeigen Druckerfreundliche Version Einloggen, um private Nachrichten zu lesen Nächstes Thema anzeigen
Autor Nachricht
rgerhards
Titel: Was ist ein Zeiger?  BeitragVerfasst am: 26.02.2009, 10:15 Uhr



Anmeldung: 25. Sep 2006
Beiträge: 688

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.
 
 Benutzer-Profile anzeigen Private Nachricht senden  
Antworten mit Zitat Nach oben
rgerhards
Titel: Was ist ein Zeiger?  BeitragVerfasst am: 26.02.2009, 11:24 Uhr



Anmeldung: 25. Sep 2006
Beiträge: 688

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?).
 
 Benutzer-Profile anzeigen Private Nachricht senden  
Antworten mit Zitat Nach oben
Beiträge vom vorherigen Thema anzeigen:     
Gehe zu:  
Alle Zeiten sind GMT + 1 Stunde
Neues Thema eröffnen   Neue Antwort erstellen
Vorheriges Thema anzeigen Druckerfreundliche Version Einloggen, um private Nachrichten zu lesen Nächstes Thema anzeigen
PNphpBB2 © 2003-2007 
:: RSS Feed: ::
Page created in 0.144165039062 seconds.

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