Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi PChar[2] := '0' -> Wirft ne AV :/ (https://www.delphipraxis.net/76343-pchar%5B2%5D-%3D-0-wirft-ne-av.html)

Win32.API 2. Sep 2006 20:54


PChar[2] := '0' -> Wirft ne AV :/
 
Hi, ich stehe gerade auf dem Schlauch, warum wirft folgendes eine AV? :

Delphi-Quellcode:
 
 pc : pchar;

 pc := 'foobar';
 pc[2] := '0';
Hoffe mal das mir jemand helfen kann, danke im vorraus :)

3_of_8 2. Sep 2006 21:07

Re: PChar[2] := '0' -> Wirft ne AV :/
 
Das verstehe ich auch nicht so ganz... :gruebel:

Delphi-Quellcode:
var pc: pchar;
    i: Integer;
begin
pc := 'foobar';
for I:=0 to 5 do showmessage(PChar(Integer(pc)+I)^);
pc^ := '0';
end;
Das hier funktioniert. Aber sobald man an die Adresse schreiben will, gibts ne AV. Du könntest noch versuchen, den PChar in einen String zu konvertieren und dann zu bearbeiten.

Win32.API 2. Sep 2006 21:14

Re: PChar[2] := '0' -> Wirft ne AV :/
 
So mache ich es zur zeit, sehe das ganze aber als umstaendlich an ;), es muss doch auch einfacher gehen :gruebel:

Bernhard Geyer 2. Sep 2006 21:15

Re: PChar[2] := '0' -> Wirft ne AV :/
 
[SPEKULATION]'foobar' ist eine String-Konstante und wird vom Compiler in ein Datensegment gelegt auf das keine defaultmäßig keine Schreibrechte vorhanden sind. Wenn Du diese Konstante ändern willst mußt du schon (z.B. mit Hilfe von Klassen der Jedi) die Attribute dieses Segmentes ändern so das Schreibrechte vorhanden sind.[/SPEKULATION]

3_of_8 2. Sep 2006 21:16

Re: PChar[2] := '0' -> Wirft ne AV :/
 
Das glaube ich nicht wirklich... Denn das dürfte nur bei Compileroptimierung der Fall sein, und mit {$O-} gehts auch nicht.

Dax 2. Sep 2006 21:41

Re: PChar[2] := '0' -> Wirft ne AV :/
 
Zitat:

Zitat von Bernhard Geyer
[SPEKULATION]'foobar' ist eine String-Konstante und wird vom Compiler in ein Datensegment gelegt auf das keine defaultmäßig keine Schreibrechte vorhanden sind. Wenn Du diese Konstante ändern willst mußt du schon (z.B. mit Hilfe von Klassen der Jedi) die Attribute dieses Segmentes ändern so das Schreibrechte vorhanden sind.[/SPEKULATION]

Fast richtig. Der Compiler legt den String als Konstante ins Codesegment.

Khabarakh 2. Sep 2006 21:43

Re: PChar[2] := '0' -> Wirft ne AV :/
 
Was sollte das mit Optimierung zu tun haben?
Wahrscheinlich das gleiche Problem wie hier:
Zitat:

Zitat von tommie-lie
Unter Linux kann man nicht schreibend in den Speicher des Images schreiben. sTarget zeigt auf den String "xxxxxx", der als Literal übergeben wurde. Das bedeutet, daß im Executable bereits dieser String auftaucht und nach dem Laden des Programmes und Ausführen der Zuweisung sTarget auf einen Speicherbereich innerhalb des Images des Executables zeigt. Ich bin nicht mehr so in den Windows-Interna, aber vielleicht ist das ja der Grund. Jedenfalls geht dein Code, wenn ich als Zielpuffer einen mit malloc() allokierten und somit schreibbaren Speicherbereich nehme.


ErazerZ 2. Sep 2006 22:22

Re: PChar[2] := '0' -> Wirft ne AV :/
 
Delphi-Quellcode:
var
  pc: PChar;
  OldProtect: dword;
begin
  pc := 'foobar';
  VirtualProtect(pc, 1, PAGE_READWRITE, OldProtect);
  pc[2] := '0';
  ShowMessage(pc);
  VirtualProtect(pc, 1, OldProtect, OldProtect);
  // funkt nimmer
  pc[2] := 'o';
  ShowMessage(pc);

Dax 2. Sep 2006 22:33

Re: PChar[2] := '0' -> Wirft ne AV :/
 
Das ist Schwachsinn. Und genau für solche Fälle hat Borland damals in die Longstrings ein Copy on Write-Demand eingebaut ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 Uhr.

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