求助:各位大哥我下面这个小程序哪里写错了啊?谢谢! ( 积分: 5 )

  • 主题发起人 主题发起人 lsh998
  • 开始时间 开始时间
L

lsh998

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button2Click(Sender: TObject);
var
s1: string;
s2: string;
s3: string;
s4: string;
// m1 : TMemoryStream;
buffer : array of byte;
begin
s1:='123';
s2:='456';
setlength(buffer,6);
CopyMemory(@buffer[0], @s1[1], length(s1));
CopyMemory(@buffer[3], @s2[1], length(s2));
CopyMemory(@s3[1],@buffer[0],3);
CopyMemory(@s4[1],@buffer[3],3);
// showmessage(s3);
// showmessage(s4);

end;

请教:
当我单击 Button2 则出现地址错误的提示?
我哪里写错了啊?

谢谢!
 
procedure TForm1.Button1Click(Sender: TObject);
var
s1: string;
s2: string;
s3: string;
s4: string;
// m1 : TMemoryStream;
buffer : array of byte;
begin
s1:='123';
s2:='456';
s3:=s2;
s4:=s1;
setlength(buffer,6);
CopyMemory(@buffer[0], @s1[1], length(s1));
CopyMemory(@buffer[3], @s2[1], length(s2));
CopyMemory(@s3[1],@buffer[0],3);
CopyMemory(@s4[1],@buffer[3],3);
showmessage(s3);
showmessage(s4);
end;
 
谢谢大哥:
procedure TForm1.Button2Click(Sender: TObject);
var
s1: string;
s2: string;
s3: string;
s4: string;
// m1 : TMemoryStream;
buffer : array of byte;
begin
s1:='123';
s2:='456';
s3:=' ';
s4:=' ';
setlength(buffer,6); // 申请空间
CopyMemory(@buffer[0], @s1[1], length(s1)); //把字符串 '123' 拷贝到 buffer
CopyMemory(@buffer[3], @s2[1], length(s2)); //把字符串 '456' 拷贝到 buffer
CopyMemory(@s3[1],@buffer[0],3); //得到前面 3个 字符
CopyMemory(@s4[1],@buffer[3],3); //得到 4-6 个字符
showmessage(s3);
showmessage(s4);

end;

错误是没有了
但是 show 出的字符串 为 '12' ,'45'
而不是 '123' ,'456'

我哪里还错了?

谢谢!
 
几句话很难说清楚
请先查资料了解一下堆和栈的基本知识
string并不是基本类型,为了方便使用Delphi做了大量的工作

你的错误在于你只是声明了一个string类型,没有给他赋值之前它只在栈上定义了一个引用,而在堆里没有分配内存。进入方法体(Begin之后)后编译器将指针赋值为空
那么你引用它并不存在的内存@s3[1]就会报错
 
muhx 已经说的很明白了!

这里不能这么写
s3:=' ';
s4:=' ';

s3:=' ';//两个以上空格
s4:=' ';
or
s3:='11';//两个以上字符
s4:='11';
 
多人接受答案了。
 
后退
顶部