关于array与string的一个问题 string类型是可以自动回收内存的,而array不行。如果你定义一个变量为string[5]而不是string的话,其实是一个ShortString类型。尽量定义成string类型吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 定义成string,而不是string[5],好象不能直接用copymemory!另外,各位大侠还没有回答我上面提的问题!谢谢! str[0]是有意义的,=length(str)ary[0]没有意义str是short string 你的问题在《delphi 5.0 开发人员指南》里会找到答案的,去看看吧 copymemory(pch,@str[1],5);与copymemory(ary,@ary[1],5)其实是一样的因为string类型就是字符数组str在内存中是连续的,你可以去试一下的,从@str[1],到@str[5]你用指针移一下,就知道了str是Borland公司封装好的ary,说的本质str还是个ary to efangdreamer: 我没有问str[0],我知道内容下标是从1开始,而0是长度。to cobi: 我看过这本书的,可是没有明确的答案呀。to qiandeng:不一样,我试了试,用copymemory(pch,@str[1],5);只能拷贝前面4个字符,最后一个是随机的有时是#1,有时又是#12而用copymemory(pch,@ary[1],5)就能完全拷贝5个。 你把getmem(pch,5);改为GetMem(pch,6)如果有问题,找我!我刚试过。你只给pch分配了5个空间,这就有问题了。pch后面必须要有一个0结束符。你不分配这一个空间,出现的问题就会很奇怪。所以你上面的随机的错误就很正常了。 str:string[5];ary:array[1..5] of char;这两个东西是一模一样的! str:string[5];ary:array[0..4] of char;这两个东西是一模一吧? str:string[5];ary:array[0..4] of char;这两个东西是一模一吧? ---------------------------这两个东西不一样!!!ary:array[0..4] of char;与pchar一样! str:string[5]是ShortString类型的了 str:string[5];ary:array[0..4] of char;这两个东西不一样啊,前面这个占用6byte内存,而后面这个是5byte。另外 array[0..4]是pchar兼容的类型(delphi定义下标从0开始的array是特殊的,即可以兼容pchar,函数原型要求是pchar的,直接可以代入而不需要类型转换)。另外,str:=‘12345’这样的赋值不太规范(我没有测过,也许也可以成功吧),因为str是一个array而不是string。另外,string内存是连续的。 iknowabc(我是我):你还有什么问题??那样不行吗? to ch81:你说“你把getmem(pch,5);改为GetMem(pch,6)如果有问题,找我!我刚试过。你只给pch分配了5个空间,这就有问题了。pch后面必须要有一个0结束符。你不分配这一个空间,出现的问题就会很奇怪。所以你上面的随机的错误就很正常了”但是copymemory(pch,@ary[1],5)就能完全拷贝5个(ary为字符数组,见前述)。 我并没有改动pch为GetMem(pch,6)呀,这样怎么就可以正确拷贝?而string[5]就不行? 这个可能是它的里面的实现机制的问题了。象在我这边,更奇怪。我两种copymemory都是正确拷贝5个字符,你说怎么样。但是这些东西,很可能是不确定的。因为主要是pch的问题。哈哈,这些都是内核问题,可惜我看不懂汇编,要不能给你个更好的答案。sorry. 如果想吧ansistring copy到array of char中,应该怎么办? 正确答案来了:str:string[5];ary:array[1..5] of char;pch:pchar;getmem(pch,5);str:='12345';ary:='12345';copymemory(pch,@str[1],5);与copymemory(pch,@ary[1],5);有什么不同?----------是一样的。在我这里结果都是$31 $32 $33 $34 $35str是否在内存中是连续的?----------是连续的str与ary有什么不同,用法又有什么不同?----------str: sizeof(str) = 6, 第0个元素为长度值。ShortString是Delphi 1的String类型,可以比较方便的进行串操作,如取串长度(Length),相加(+),取子串(Copy)等;ary: 仅为字符数组,sizeof(ary) = 5, 你不能进行以上操作,取串长度必须使用Windows的串操作(StrLen),并且有一个#0作串结束符;相加只能用StrCat且必须事先分配好目标地址空间;取子串必须先分配空间然后执行StrLCopy而且别忘了在最后加设一个#0(空字符)String的情况-------------String其实是一个指针,空串''其实是一个值为0的指针。有效的指针指向一个结构,包含了分配的大小(四个字节)、引用次数(四个字节)、串长度(四个字节)及一片内存区域。所以SizeOf(String变量)会等于4。不过Delphi会处理各种串运算,你不必劳神。 做类似OFFICE2007的界面,用什么控件? 看看这个(没分了) TComboBox 重画问题!急-----在线等!大虾帮帮忙! 复制.txt的文本粘贴到代码区,显示的是‘?’,急…… AdoQuery 里Parameters使用出现了问题,请帮忙一下 对newyj版主不得不说的话。。。?顶者有分!!! 实现界面重定义的问题! 50分求:TMSSoftware的 instrumentation workshop组件 喜欢ado的朋友请进 如何在dbgrid中显示数据!!!!! 如何取得字符串首字母的ASCII值? 请高用指点 关于BYTE类型还会使用的问题
另外,各位大侠还没有回答我上面提的问题!谢谢!
ary[0]没有意义
str是short string
与copymemory(ary,@ary[1],5)其实是一样的
因为string类型就是字符数组
str在内存中是连续的,你可以去试一下的,从@str[1],到@str[5]你用指针移一下,就知道了
str是Borland公司封装好的ary,说的本质str还是个ary
我没有问str[0],我知道内容下标是从1开始,而0是长度。
to cobi:
我看过这本书的,可是没有明确的答案呀。
to qiandeng:
不一样,我试了试,用copymemory(pch,@str[1],5);只能拷贝前面4个字符,最后一个是随机的有时是#1,有时又是#12而用copymemory(pch,@ary[1],5)就能完全拷贝5个。
如果有问题,找我!我刚试过。你只给pch分配了5个空间,这就有问题了。
pch后面必须要有一个0结束符。你不分配这一个空间,出现的问题就会很奇怪。
所以你上面的随机的错误就很正常了。
ary:array[1..5] of char;
这两个东西是一模一样的!
ary:array[0..4] of char;
这两个东西是一模一吧?
ary:array[0..4] of char;
这两个东西是一模一吧?
---------------------------
这两个东西不一样!!!
ary:array[0..4] of char;
与pchar一样!
是ShortString类型的了
ary:array[0..4] of char;
这两个东西不一样啊,前面这个占用6byte内存,而后面这个是5byte。
另外 array[0..4]是pchar兼容的类型(delphi定义下标从0开始的array是特殊的,即
可以兼容pchar,函数原型要求是pchar的,直接可以代入而不需要类型转换)。
另外,str:=‘12345’这样的赋值不太规范(我没有测过,也许也可以成功吧),
因为str是一个array而不是string。
另外,string内存是连续的。
你说“你把getmem(pch,5);改为GetMem(pch,6)
如果有问题,找我!我刚试过。你只给pch分配了5个空间,这就有问题了。
pch后面必须要有一个0结束符。你不分配这一个空间,出现的问题就会很奇怪。
所以你上面的随机的错误就很正常了”但是copymemory(pch,@ary[1],5)就能完全拷贝5个(ary为字符数组,见前述)。 我并没有改动pch为GetMem(pch,6)呀,这样怎么就可以正确拷贝?而string[5]就不行?
象在我这边,更奇怪。我两种copymemory都是正确拷贝5个字符,你说怎么样。
但是这些东西,很可能是不确定的。因为主要是pch的问题。
哈哈,这些都是内核问题,可惜我看不懂汇编,要不能给你个更好的答案。
sorry.
ary:array[1..5] of char;
pch:pchar;
getmem(pch,5);str:='12345';
ary:='12345';copymemory(pch,@str[1],5);
与copymemory(pch,@ary[1],5);有什么不同?
----------
是一样的。在我这里结果都是$31 $32 $33 $34 $35
str是否在内存中是连续的?
----------
是连续的str与ary有什么不同,用法又有什么不同?
----------
str: sizeof(str) = 6, 第0个元素为长度值。ShortString是Delphi 1的String类型,可以比较方便的进行串操作,如取串长度(Length),相加(+),取子串(Copy)等;
ary: 仅为字符数组,sizeof(ary) = 5, 你不能进行以上操作,取串长度必须使用Windows的串操作(StrLen),并且有一个#0作串结束符;相加只能用StrCat且必须事先分配好目标地址空间;取子串必须先分配空间然后执行StrLCopy而且别忘了在最后加设一个#0(空字符)String的情况
-------------
String其实是一个指针,空串''其实是一个值为0的指针。有效的指针指向一个结构,包含了分配的大小(四个字节)、引用次数(四个字节)、串长度(四个字节)及一片内存区域。所以SizeOf(String变量)会等于4。不过Delphi会处理各种串运算,你不必劳神。