![]() |
AW: Pointeradresse auslesen
ok, ich habe da etwas falsch verstanden. Mit New weisst Du Eingabe schon etwas zu.
Schau mal auf ![]() Da steht "The size of the allocated memory block corresponds to the size of the type that P points to.". Weisst du wieviel das ist? Sicher nicht genug um immer alles von deinem Eingabefeld zu speichern. Was IntToStr(Integer(Eingabe)) zurück gibt kann ich dir gerade nicht sagen. Das könnte davon abhängen ob Du für 32-Bit oder 64-Bit compilierst und wie Integer implementiert ist. Unsere Umstellung auf 64-Bit ist schon länger her und ich habe das vergessen. Da ich nie einen Pointer auf einen Integer caste (weils einfach schlecht ist) brauche ich das auch nicht. (Und nachzuschauen bin ich zu faul) |
AW: Pointeradresse auslesen
Das ist völlig irrelevant, ob der Speicherplatz ausreicht. Es ist lediglich ein Test zum Verständnis von Zeigern.
Wenn ich die Speicheradresse eines Zeigers ausgeben will, muss ich wohl in einen Integer casten, da ich einen Zeiger nicht anzeigen kann. Noch einmal die Frage: Was gibt IntToStr(Integer(Eingabe)) zurück, wenn, wie in diesem Fall, Eingabe ein Zeiger ist? |
AW: Pointeradresse auslesen
@Paul.Kunig:
Zitat:
Aber ganz oben in #1 steht: "Delphi-Version: 5" |
AW: Pointeradresse auslesen
Zitat:
Da freimatz "für 64 Bit Compilieren" ins Spiel brachte: Es wäre besser IntToStr(NativeInt(Eingabe)) zu schreiben, denn unter 64Bit hat ein Pointer 8 Bytes. Wenn du unter 64Bit Eingabe nach Integer castest kriegst du nur die unteren 4 Bytes der Adresse, dagegen, wenn du nach NativeInt castest kriegst du unter 32Bit 4 Bytes und unter 64Bit 8 Bytes. |
AW: Pointeradresse auslesen
Zitat:
Ich hab auch anfänglich gedacht, dass das problematisch sein könnte. Tatsächlich werden mit New(Eingabe) nur 4 Bytes (ich bin bei 32Bit) auf dem Heap reserviert. Aber: mit
Code:
wird nicht einfach die Zeichenkette zu Eingabe^ kopiert, sondern es wird ein neuer String erzeugt. An Eingabe^ steht dann die Adresse des neu erzeugten Strings also 4 Bytes.
Eingabe^ := Edit1.Text;
|
AW: Pointeradresse auslesen
Zitat:
<nostalgiemodus> Delphi 1 : String = ShortString Delphi 2..2007 : String = AnsiString </nostalgiemodus> |
AW: Pointeradresse auslesen
@Amateurprofi: Hm, ja, richtig, daran habe ich nicht gedacht. Also ist der String selber schon ein Pointer - auf dieses komische Konstrukt wo vorne die Grösse und der Refenzzähler gespeichert ist. Dann klappt das trotzdem so, auch wenn es keinen Sinn macht.
<Klugscheiss>Soweit ich weiss wird jedoch bei der Zuweisung der String nicht kopiert sondern erstmal nur die Referenz bis sich einer der beiden ändert.</Klugscheiss> |
AW: Pointeradresse auslesen
Zitat:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Eingabe: ^Integer; // für die Variable "Eingabe" wird Platz auf dem Stack reserviert begin New(Eingabe); // reserviert Platz für den Integer im Speicher Eingabe^ := 123; // der reserviert Platz wird mit einem Wert gefüllt ShowMessage(IntToStr(Eingabe^) + #13#10 + // Erwartete Ausgabe "123" IntToStr(Integer(Eingabe)) + #13#10 + // Erwartete Ausgabe: Wert des Zeigers auf "123" IntToStr(Integer(@Eingabe)) + #13#10 + // Erwartete Ausgabe: Adresse der Variablen "Eingabe" (die Adresse auf dem Stack) IntToStr(Integer(Addr(Eingabe))) // wie vorherige Zeile ); Dispose(Eingabe); // gibt den Platz für den Integer wieder frei end; |
AW: Pointeradresse auslesen
Zitat:
|
AW: Pointeradresse auslesen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz