Code: Alles auswählen
program Project1;
const
max = 10;
var
i: integer;
s: string;
widget: array[0..max] of record
pc: PChar;
end;
begin
for i := 0 to max do begin
str(i, s);
widget[i].pc := PChar('Button' + s);
WriteLn(widget[i].pc);
s[4] := 'x';
end;
WriteLn();
for i := 0 to max do begin
WriteLn(widget[i].pc);
WriteLn(PtrUInt(widget[i].pc));
end;
end.
Code: Alles auswählen
Button0
Button1
Button2
Button3
Button4
Button5
Button6
Button7
Button8
Button9
Button10
Button10
140710960345240
Button10
140710960345240
Button10
140710960345240
Button10
140710960345240
Button10
140710960345240
Button10
140710960345240
Button10
140710960345240
Button10
140710960345240
Button10
140710960345240
Button10
140710960345240
Button10
140710960345240
Und jeder PChar im Array zeigt auf die gleiche Adresse.
Was ich noch dachte, das der PChar auf auf den String zeigt, aber dies kann ich auch nicht nachweisen, das ich ein Zeichen folgendermassen im String verändert habe:
Code: Alles auswählen
s[4] := 'x';
Code: Alles auswählen
11 memory blocks allocated : 346/352
9 memory blocks freed : 314/320
2 unfreed memory blocks : 32
True heap size : 32768
True free heap : 32256
Should be : 32352
Call trace for block $00007FD2D8EEF200 size 32
Marked memory at $00007FD2D8EEF100 invalid
Wrong signature $A8523398 instead of 079F9929
Oder gibt es dafür etwas fertiges ?
Ich vermute der C-Programmierer löst dies mit "strdub".