Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Cast nach PChar() castet in Wirklichkeit nach PAnsiChar

  Alt 30. Sep 2014, 11:55
Delphi-Version: XE5
Ich hätte nicht gedacht, so eine Frage einmal stellen zu müssen. Das Thema PWideChar/PAnsiChar/PChar sollte hier ja eigentlich zur Genüge abgefrühstückt worden sein.

Trotzdem bin ich hiermit auf die Nase gefallen, und ich verstehe es nicht:

Habe ich eine Variable myStrA: AnsiString , gibt der Cast PChar(myStrA) nicht einen PChar sondern einen PAnsiChar zurück! Warum? Noch besser: Warum verhält sich PChar(AnsiString('Test')) anders und gibt, wie erwartet, einen PChar zurück?


Das Beispielprogramm
Delphi-Quellcode:
// JCL_DEBUG_EXPERT_GENERATEJDBG OFF
// JCL_DEBUG_EXPERT_INSERTJDBG OFF
// JCL_DEBUG_EXPERT_DELETEMAPFILE OFF
program Project99;

{$APPTYPE CONSOLE}
{$R *.res}

uses System.SysUtils;

var
   myPChar: PChar;

   myStrA: AnsiString;
   myStrB: String;

procedure printChars(const content: Pointer);
const
   maxLength: Integer = 10;
var
   pos: Integer;
   foundNull: Boolean;
begin
   Write(sLineBreak);

   foundNull := False;
   for pos := 0 to Pred(maxLength) do begin
      Write( (PByte(content)+pos)^ );


      if (PByte(content)+pos)^ = 0 then
         if not foundNull then
            foundNull := True
         else
            Break
      else
         foundNull := False;

      Write('.');
   end;

   Write(sLineBreak);
end;

begin
   myStrA := 'Test';
   myPChar := PChar(myStrA); // W1044 Bedenkliche Typumwandlung von AnsiString in PWideChar
   printChars(myPChar);

   myPChar := PChar(AnsiString('Test'));
   printChars(myPChar);

   myStrB := 'Test';
   myPChar := PChar(myStrB);
   printChars(myPChar);

   readln;
end.
erzeugt folgende Ausgabe
Code:
84.101.115.116.0.0

84.0.101.0.115.0.116.0.0

84.0.101.0.115.0.116.0.0
  Mit Zitat antworten Zitat