Delphi中,对String的SetLength问题(20)

  • 主题发起人 主题发起人 BiPigBen1001
  • 开始时间 开始时间
B

BiPigBen1001

Unregistered / Unconfirmed
GUEST, unregistred user!
请教高手们: var ss:String;begin setLength(ss,10)
ss:='0123456789ABCDEFG'
showMessage(ss);end;执行完setLength ,ss的最大长度不是10吗,那么showMessage(ss)应该是0123456789,为什么执行后是0123456789ABCDEFG了
 
var ss:String;begin ss:='0123456789ABCDEFG'
setLength(ss,10)
showMessage(ss);end;试试
 
你定义ss为string型的变量,一般不需要用SetLength。
 
String在delphi中是自管理的数据类型
 
var ss:String[10];
 
SetLength(ss,10)
//这句表示为 ss 分配一个能容纳10字符的内存ss:='0123456789ABCDEFG'
//这句表示为ss分配一个能容纳 '0123456789ABCDEFG' 这么长的内存,并将 '0123456789ABCDEFG' 放到这个内存中(逻辑上是这样的,至于实际上是让ss直接指向 '0123456789ABCDEFG' 常量还是重新分配内存再复制,那就是delphi优化的问题了)所以说,你上面的代码,实际上是让ss分配了两次内存,两次分配之间没有什么联系。采用 SetLength分配内存后,一般情况下,是将ss作为一个指针直接用或者直接使用ss[1]、ss[2]......等。
 
发完了才发现,又是你。大富翁好萧条啊
 
既然你这么好学,再送你点,呵呵使用SetLength的情况之一是从某个内存中向字符串中复制内容,例如从TMemoryStream中var ms: TMemoryStream
ss: AnsiString;begin ...... SetLength(ss, ms.Size)
//为ss开辟和内存流中保存的内容一样大的空间 Move(ms.Memory^, Pointer(ss)^, ms.Size)
//从内存流中复制到ss中,这种复制必须保证ss先开辟了足够大的内存 ......end;
 
感谢各位的回答,特别感谢放飞,一直都在无私的回答我的问题,在此谢过了,我的QQ:519781013,不知道放飞大侠是否愿意加我,我想我要跟你学的东西实在是太多了!
 
有问题还是上论坛吧,我平时很少上qq
 
后退
顶部