AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Win32.API · begonnen am 2. Sep 2006 · letzter Beitrag vom 2. Sep 2006
Antwort Antwort
Win32.API

Registriert seit: 23. Mai 2005
312 Beiträge
 
#1

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

  Alt 2. Sep 2006, 21:54
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
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

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

  Alt 2. Sep 2006, 22:07
Das verstehe ich auch nicht so ganz...

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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Win32.API

Registriert seit: 23. Mai 2005
312 Beiträge
 
#3

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

  Alt 2. Sep 2006, 22:14
So mache ich es zur zeit, sehe das ganze aber als umstaendlich an , es muss doch auch einfacher gehen
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.197 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 2. Sep 2006, 22:15
[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]
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#5

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

  Alt 2. Sep 2006, 22:16
Das glaube ich nicht wirklich... Denn das dürfte nur bei Compileroptimierung der Fall sein, und mit {$O-} gehts auch nicht.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

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

  Alt 2. Sep 2006, 22:41
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.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

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

  Alt 2. Sep 2006, 22:43
Was sollte das mit Optimierung zu tun haben?
Wahrscheinlich das gleiche Problem wie hier:
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

Registriert seit: 27. Mai 2005
Ort: Baden
315 Beiträge
 
Delphi 2007 Enterprise
 
#8

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

  Alt 2. Sep 2006, 23:22
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);
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#9

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

  Alt 2. Sep 2006, 23:33
Das ist Schwachsinn. Und genau für solche Fälle hat Borland damals in die Longstrings ein Copy on Write-Demand eingebaut
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:17 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