Download Programmierung in Pascal - KOBRA

Transcript
Kapitel 10 – Zeiger und dynamische Strukturen
137
Wahnsinn := @lokalesi;
end;
begin
i := 17;
p := @i;
p^ := p^ + 1;
writeln(“Der Wert von i ist “, i:3);
p := Wahnsinn;
writeln(“Der wahnsinnige Wert ist “, p^ : 3);
end.
Das Problem hier ist, daß p auf eine Variable zeigt, die nur solange existiert, wie die Funktion Wahnsinn existiert, da sie lokal zur Funktion
vereinbart ist. Lokale Variablen einer Funktion oder Prozedur kommen
auf einen Stapel und werden zum Überschreiben freigegeben, wenn das
Programm aus der Funktion zurückgekehrt.
Das Programm oben läuft trotzdem und wird in der Regel die Werte
18 und 17 liefern, weil p noch auf den nicht wieder überschriebenen
Bereich des Stapels zeigt. In einem längeren Programm, speziell einem
mit vielen Aufrufen, wird p aber einen unsinnigen Wert liefern oder das
Programm „macht den Abflug“, weil dieser Stapelbereich als nicht gültig
erkannt wird.
Es ist der Alptraum eines jeden Programmierers, Programmfehler in
Programmen finden zu müssen, die einen liberalen Umgang mit Pointern
betreiben und womöglich Konstruktionen der obigen Art enthalten.
10.5 Dynamische Strukturen
Standard Pascal läßt den Adreßoperator @ (bzw. Addr()) nicht zu. Die
Methode, eine Zeigervariable auf ein Objekt zeigen zu lassen, ist das
Objekt mit new(p) anzulegen, wobei p ein typisierter Zeiger ist, der
dann auf das Objekt zeigt. Aus der Typisierung weiß der Compiler, welche Art von Objekt erzeugt werden soll.
type
IntPtr = ˆInteger;
RealPtr = ˆReal;
KundenPtr = ˆKundentyp;{Zeiger auf Kundenrecords}