Move函数很诡异的问题(50分)

  • 主题发起人 主题发起人 akalun
  • 开始时间 开始时间
A

akalun

Unregistered / Unconfirmed
GUEST, unregistred user!
请看下面的代码
var
a:array[0..4] of char;
q:pchar;
len:integer;

new(q);
a:='hello';
len:=4;
move(a,q^,len);
edit2.Text:=q;
showmessage(inttostr(length(q)));
我把len设成4的时候得到q的长度是6,内容是hell ,后面2位是#240和8
把len设成5的时候长度也是6,内容是hello8

请问这是这么回事?
 
问题出在 New(q) 上, 如果 q的定义改为
q: ^array[0..6] of Char, 就好了
 
改成数组当然可以,问题是为什么不能用指针?
 
可以GetMem(q, 6);
 
用GetMem(q,6)结果也是一样
 
new(q)改成 GetMem(q,6)

move后加
q[len] := #0;//表示字符串结束
 
PChar类型是和C兼容的以0结尾的字符串,这样Move结果是不确定的。
 
在我的机子上正常的,用D6
 
用D7就不对了。len设成4 q的长度是5。其它好像是对的
 
多人接受答案了。
 
用move(a,q^,length(a));
 
new(q);
a:='hello';
len:=length(a);
move(a,q^,len);
q[len]:=#0;
edit2.Text:=q;

发现用GetMen还是new无所谓,主要是要在结尾手动加上#0
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部