var
b:string;
c:string[5];
begin
b :='12345';
copymemory(@c,pchar(b),5);
memo1.Lines.Add(c);
end;
它的内容为'2345**'.我的问题是怎么修改copymemory(@c,pchar(b),5)中@c这个地方,让上面的过程等于c:=b,
即c的内容为:c:='12345'.
b:string;
c:string[5];
begin
b :='12345';
copymemory(@c,pchar(b),5);
memo1.Lines.Add(c);
end;
它的内容为'2345**'.我的问题是怎么修改copymemory(@c,pchar(b),5)中@c这个地方,让上面的过程等于c:=b,
即c的内容为:c:='12345'.
解决方案 »
- adoquery1.UpdateBatch 的问题
- 请教如何将PHP代码转换成delphi代码
- SetFileTime修改文件时间,修改后的结果与我传入的不同
- ▲▲▲ 如何定时结束指定的进程(例如结束任务管理器的shutdown.exe进程)▲▲▲
- 如何实现窗口透明,但是窗口上的文字不透明
- FeedDemon注册码,顺便散分
- 关于数据连接中断后的处理问题?
- 200分相赠---谁知道那里可以下载《borland 传奇》
- 如何存取服务器的目录下的文件?
- 从Delphi程序代码中如何拿到FastReport的总页数和其中一个对象在页面上的位置(不ShowReport的情况下)?
- 用 XML Data Binding 生成Pas文件后,怎样操作(读写)?(最好有例子)
- 想学智能卡编程的进来看看
b:string;
c:string[5];
begin
b :='1234'#0;
copymemory(Pointer(Integer(@c)+1),pchar(b),5);
memo1.Lines.Add(c);
end;
string类似第一个字节存放的是引用计数
另,如果c不是以#0结尾,会访问不属于它的内存.
var
a,b:string;
begin
b :='12345';
SetLength(a,5);
copymemory(pchar(a),pchar(b),5);
memo1.Lines.Add(a);
end;
这个是成功的.所以我想看看如果先给定了string的长度,会怎么样,结果不行.
你做一下试验就知道了.我的问题不会出现“它的内容为'2345**'.”这个的,
我之所以那样写,是因为我用showmessage调试,才会出现,所以你的解释是不通的。
string与string[5]是不同的.如果你知道内部怎么实现的,你就不会有这样的问题了
这是概念混淆了string类型默认是AnsiString类型的
string[5]这样的形式是ShortString类型的ShortString是Delphi 1.0中字符串的类型,在内存中,它就像是一个字符数组,在字符串的第0个元素中存放了字符串的长度,紧跟在后的字符才是字符串本身。看到这明白了吗?他的实际长度比字符串的长度多一位所以你上面的总是显示2345你改成这样再看看var
b:string;
c:string[6];//注意这里长度要变啦
begin
b :='12345';
copymemory(@c[1],pchar(b),5);//这里也别从第0位copy啦
String[0]是字符串的长度
String[1]开始才是内容.
剩下的你自己搞定吧.
好像还不是这么简单,你试试这个
var
b:string;
c:string[6];//注意这里长度要变啦
begin
b :='1234567890';
copymemory(@c[3],pchar(b),3);//这里也别从第0位copy啦
memo1.Lines.Add(b);
end;
b... ...-_-!
var
b:string;
c:string[5];
begin
b :='1234'#0;
self.Caption:=inttostr(length(b));//加上这一句,你的程序就显示不出来
copymemory(Pointer(Integer(@c)+1),pchar(b),5);
memo1.Lines.Add(c);
end;
这个怎么解释呢?
你的程序和上面那位也一样;
var
b:string;
c:string[6];//注意这里长度要变啦
begin
b :='12345';
self.Caption:=inttostr(length(b));//我只要加上这句话,就显示不了了,证明你这种内存拷贝
存在问题。
copymemory(@c[1],pchar(b),5);//这里也别从第0位copy啦
memo1.Lines.Add(c);
end;
不要用move,我就是要用copymemory,我要搞明白静态string它的指针是怎么指的。
首先说明一下copymemory和move根本就是一回事,
copymemory只是对move进行了一下封装,看vcl源代码就可以看到
然后回到你的问题上
果然不是我说的那么简单,呵呵
以前还真的没发现,我这里也是这样试了一下,挺有意思的
就像这样
var
b:string;
c:string[10];
begin
b :='12345678901234567890';
c:='*****'; //c:='*'; //换成初始化一部分看看,这里最有意思,哈
//zeromemory(@C[1],sizeof(c)-1); //这句你可以加上看看效果
caption:=inttostr(length(b));
copymemory(@c[1],pchar(b),3);
showmessage(C);
end;有点意思,哈
定义的长度只不过是它的最大长度罢了
否则它是不会越界的,编译器是会自动给它把多余的位数截掉的
就像这样var
c:string[5];
begin
c:='12345678';
showmessage(C);//会直显示12345。如果用copymemory,超过5就会报错的
end;
还有纠正一下我上面说的,定义的时候不用多定义一位,他的size会自动加1的
看来比起string,ShortString是相当随意的
哪到底怎么复制才可以呢?算了,再坚持一天我就结帐。
我知道怎么回事了