procedure TForm2.Button10Click(Sender: TObject);
var
c,c1: PChar;
begin
GetMem(c, 5);
c1 := '11.2';
Move(c1,c,4);
ShowMessage(c);
FreeMem(c);
end;
這個代碼為什么freemem就報錯?如果我為pchar變數申請了記憶體,要怎樣才能寫內容進去?好像不用getmem也能直接用,就好像c1那樣,用move把c1的內容復制到c,為什么freemem就報錯了?
uj5u.com熱心網友回復:
http://blog.csdn.net/tjb_1216/article/details/4627346
procedure TForm1.Button1Click(Sender: TObject);
var
c,c1: PChar;
begin
GetMem(c,5);
FillChar(c^,5,#0);
c1:='11.2';
Move(c1^,c^,4);
ShowMessage(c);
FreeMem(c);
end;
uj5u.com熱心網友回復:
謝謝,請問下,Move(c1,c,4);為啥報錯?
uj5u.com熱心網友回復:
pchar,是不是只能用move,strcopy之類的函式操作?如果有個pchar,長度是10,我想改第5個字符,該怎么寫?uj5u.com熱心網友回復:
我知道了1、Move(c1,c,4);導致freemem報錯,是因為move是把c1的地址給了c,之后再freemem,就報錯了。
2、以下代碼可以修改pchar的內容:
procedure TForm2.Button10Click(Sender: TObject);
var
c,c1: PChar;
begin
GetMem(c, 5);
c1 := c;
c1^ := '1';
Inc(c1);
c1^ := '3';
Inc(c1);
c1^ := '5';
ShowMessage(c);
FreeMem(c);
end;
pchar其實可以理解為^char,指向字符的指標(反正指標都一樣,就是個保存地址的整型,無論指向什么型別,型別是為了方便編碼而弄出來的概念——我的理解),getmem給pchar分配記憶體,其實就是給了pchar一個地址,并分配了一段連續的記憶體空間,pchar本身還就是一個整型的地址,如果inc(c),就會導致c指向原地址的下一個記憶體的地址,其實也是可以寫入,但是最后到釋放記憶體時,就會報錯了,因為c的地址不是原來分配的地址了,釋放就釋放到別人的記憶體里去了,所以,用c1替代c做移動指標的操作,就可以了。
uj5u.com熱心網友回復:
procedure TForm1.btn1Click(Sender: TObject);
var
c,c1: PChar;
begin
GetMem(c,5);
//FillChar(c^,5,#0);
c1:='11.2';
Move(c1^,c^,4);
c[4]:=#0;
ShowMessage(c); //11.2
c[0]:='2';
c[3]:='5';
ShowMessage(c);//21.5
FreeMem(c);
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/50800.html
標籤:語言基礎/算法/系統設計
上一篇:如何把表單做成像QQ那樣的有陰影
