Thema: Delphi Ist Pointer(0) = nil?

Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.685 Beiträge
 
Delphi 2007 Enterprise
 
#12

Re: Ist Pointer(0) = nil?

  Alt 25. Dez 2009, 04:23
Naja, NULL heisst das Teil, weil in der Mathematik die 0 ja wirklich Repräsentant von "nichts" ist, und das hat man so übertragen. Ich vermute mal, dass man dann irgendwann gemerkt hat, dass "0" ja durchaus ein definierter Wert ist, und man zusätzlich den Bedarf an einem "undefiniert", bzw. "leer" hatte, der nicht dem definierten Wert 0 entsprechen durfte. Daher ist das Konzept "NULL" vom Wert "0" prinzipiell grundverschieden.

Warum ist es aber oft so, dass dennoch der sehr wohl definierte Wert 0 auftaucht? Das ist in der Art und Weise begründet wie die gängigen Betriebssysteme arbeiten. Der Speicher an der Stelle 0 ist ein vom laufenden Programm aus nicht zugänglicher Bereich. Das eigentliche Programm (=Codesegment) beginnt immer bei einer Adresse > 0, ich glaub bei DOS PE Executables bei $0400 oder $0800, kann mich aber auch irren. Das bot allerdings, egal wie der Wert nun genau ist, die Möglichkeit "0" als Adresse für Pointer zu verwenden, die "undefiniert", also NULL sind. Kein gültiger Pointer würde jemals an Adresse 0 verweisen, da es immer ein illegaler Zugriff wäre (einschlägige Exceptions kennt wohl jeder hier denke ich ). Deswegen, und nur deswegen ist unter sehr vielen Programmiersprachen NULL = 0. Die Namensverwandtschaft ist also eigentlich fast eher zufällig, nicht ursächlich.
Unter C bietet diese Konvention u.a. die Möglichkeit Konstrukte wie "if (ObjectVariable) {...}" zu basteln (welche auch sehr oft benutzt werden/wurden). Wenn ObjectVariable nämlich NULL (=0) ist, bewirkt der implizite Cast auf Bool das Ergebnis "false", so dass ohne eigentlichen Vergleich einfach eine Objektvariable wie ein Bool interpretiert werden kann, womit man nun also testen kann ob sich hinter dem Pointer ein erzeugtes Objekt befindet oder nicht (*). Unter Delphi macht man das mit Assigned(), und die C-Schreibweise sollte man auch mittlerweile tunlichst nicht mehr nehmen, da sie nicht grad aktuellen syntaktischen Standards entspricht.

*) Jau, auch hier kann man sich selbst ins Knie schießen und die Instanz freigeben ohne den Pointer zu nullen. Dann zeigt der Pointer nicht auf NULL, hat aber auch keine gültige Instanz hinter sich. Geht unter Delphi auch, man muss nur FreeAndNil() missachten, und nur Instanz.Free() benutzen

Aber ich schweife ab...
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat