Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Pointeradresse auslesen (https://www.delphipraxis.net/201931-pointeradresse-auslesen.html)

paul.kunig 13. Sep 2019 12:02

AW: Pointeradresse auslesen
 
Zuerst einmal Danke für die vielen Antworten.

Jedoch lüftet sich der Schleier nur sehr langsam.

IntToStr(Eingabe^) = Dereferenzierung des Zeigers. Ausgabe des unter der Adresse abgelegten Wertes.

IntToStr(Integer(Eingabe)) // Erwartete Ausgabe
Welche Ausgabe? Es handelt sich um einen Zeiger!

IntToStr(Integer(@Eingabe)) Adresse auf dem Stack.
Warum Adresse des Stacks? Es geht doch um die Adresse des reservierten Speicherplatzes auf dem Heap!

Meines Wissens nach wird der Heap benutzt, wenn größere Datenstrukturen verwendet werden.
Da der Stack in seiner Größe sehr beschränkt ist, weicht man mit Zeigern auf den Heap aus.

Das heißt doch, dass die lokal angelegte Variable lediglich die Adresse des Zeigers, der auf den Heap zeigt, speichert.

Somit müsste man folgende Werte aus der lokalen Variable auslesen können:
1) Adresse der lokalen Variable auf dem Stack
2) Wert der Variable, der in diesem Fall lediglich die Adresse des Zeigers, der auf den Heap zeigt, darstellt.

Ist diese Adresse 4 bzw.8 Byte groß?
Wenn ja, wofür brauchen wir dann den Zeiger, der ja die gleiche Größe hat?

Nach dieser Aufbereitung komme ich zu folgendem Schluss:
IntToStr(Integer(Eingabe))
gibt die eigentliche Adresse des Zeigers auf den Heap zurück, da dies der abgelegte/gespeicherte Wert in der lokalen Variable ist.

IntToStr(Integer(@Eingabe)) als auch
IntToStr(Integer(Addr(Eingabe)))
gibt die Adresse der lokalen Variable zurück, für die im Stack Speicher reserviert wurde, um die Adresse des Zeigers zu speichern.

Dies kommt mir logisch vor, widerspricht aber der bisherigen Dokumentation, in der gesagt wird, dass @ und Addr() die Adresse des Zeigers wiedergeben.
Abschließend sei gesagt, dass nicht näher erläutert ist, welcher Zeiger gemeint ist, da auch die lokale Variable im Hintergrund lediglich ein Zeiger ist.

Gruß und Danke an alle

Dennis07 20. Sep 2019 15:28

AW: Pointeradresse auslesen
 
Nimm statt Integer(MeinZeiger) besser
Delphi-Quellcode:
NativeInt(MeinZeiger)
oder noch besser dessen Alias
Delphi-Quellcode:
IntPtr(MeinZeiger)
. Das funktioniert nicht nur unter Win32, sondern auch Win64 und anderen Plattformen.

p80286 21. Sep 2019 20:40

AW: Pointeradresse auslesen
 
Zitat:

Zitat von paul.kunig (Beitrag 1446000)

Dies kommt mir logisch vor, widerspricht aber der bisherigen Dokumentation, in der gesagt wird, dass @ und Addr() die Adresse des Zeigers wiedergeben.

@ und Addr() liefern beide die Speicheradresse (Pointer) der angesprochenen Variablen.
Mit New(mypointer) reservierst Du Speicher auf dem Heap entsprechend dem Typ auf den mypointer zeigen soll. Weiterhin wird in mypointer die Startadresse des reservierten Speichers abgelegt.

Gruß
K-H

@Sherlock
Gut gebrüllt Löwe. Aber wenn jemand wissen will was es mit Pointern und dem Heap auf sich hat ist das eigentlich positiv zu werten, denn ungesundes Halbwissen auf diesem Gebiet ist tödlich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz