getMem问题(100分)

  • 主题发起人 主题发起人 wzwcn
  • 开始时间 开始时间
W

wzwcn

Unregistered / Unconfirmed
GUEST, unregistred user!
var s,p:Pchar;
begin
s:='AAA';
getMem(p,length(s)*2);
BinToHex(s,p,length(s));
showmessage(p);
freeMem(p);
end;
这段代码得的结果后面总会有其他字符,我这里是414141rm1,但是如果我改成下面这样却是正常的,为什么用getMem分配内存会这样,哪位高手给我讲解一下:
var s,p:string;
begin
s:='AAA';
BinToHex(pchar(s),pchar(p),length(s));
showmessage(p);
end;
------------------------------------------------
经实验发现,把窗体名改成非Form1就正常,改成Form1就会出现上面的情况,我用是D2006,郁闷了
 
getMem 只是分配了内存,不会对存储空间进行初始化,所在p指向的内存存储的可能是任何字符。用FillChar对新分配的内存进行初始化就可以了。
 
getMem(p,length(s)*2);
改成
getMem(p,length(s)*2 + 1);
Zeromemory(p, length(s)*2 + 1);
实际上你的做法是没问题的.关键在于PChar是以#0为标志结尾的.你分配的长度正好,那么后面就会判断不了结尾.所以你还是要把长度多分配一个.填上0.
 
var s,p:Pchar;
begin
s:='AAA';
getMem(p,length(s)*2);
BinToHex(s,p,length(s));
showmessage(string(p))
// 加一个String()即可!
freeMem(p);
end;
 
多人接受答案了。
 
后退
顶部