procedure TForm1.Button1Click(Sender: TObject);
var
  a,b:array[0..100] of char;
begin
  b:='12345';
  copymemory(a,b,4);
end;原因: String不能这样用,因为String是个指针,它指向一个字符。

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      a, b: string;
    begin
      b := '12345';
      SetLength(a, 4); //需要分配资源
      CopyMemory(@a[1], @b[1], 4); //@a <> @a[1]//string最前的字节不是保存第一个字符
      ShowMessage(a);
    end;
      

  2.   

    在实际工作中,对string类型的处理没有必要用CopyMemory来处理
    处理string的函数是很多的,而且string很安全。参考:Copy()、Pos()等函数
      

  3.   

    楼上完全正确,不过有个问题。如果写成
    procedure TForm1.Button1Click(Sender: TObject);
    var
      a, b: string;
    begin
      b := '12345';
      SetLength(a, 10); //需要分配资源
      CopyMemory(@a[1], @b[1], 1); //@a <> @a[1]//string最前的字节不是保存第一个字符
      ShowMessage(a);
    end;它出的结果第一次是‘1’,但第二次是‘1utton1’,严重不解??
    关注。
      

  4.   

    to all:谢谢!
    to  laisxy(不懂即懂,懂即不懂):
      不知道你有没有运行一下,你写的代码在我机器上的delphi6下出现这样的错误:
    [Error] Unit1.pas[31]:Incopatible types:'array' and 'pointer'
    copymemory的前两个参数要求是指针啊类型啊to  zswang(伴水)(流浪在北京):
      谢谢你,问题这样就可以解决了。
      我知道用copy,我只是想知道这个错误在哪里。to moudy(勇士) :
      我怎么没出现这种情况?
      

  5.   

    string 是 pascal 特殊的数据类型
    早期的string只能保存255长度的字串
    原因是用第一个字节保存长度,而一个字节只能表示0..255到了Delphi1明显,长度为255的字串已经不实用了
    在Delphi2 string类型有了扩充,可以保存相对无限制长度
    具体的存储格式Borland并没有公开所以S[1]并不是string的首位置
    procedure TForm1.Button1Click(Sender: TObject);
    var
      vBuffer: array[0..255] of Char;
      vString: string;
    begin
      vString := '不赋值访问下标就危险';
      if @vBuffer = @vBuffer[0] then
        ShowMessage('@vBuffer = @vBuffer[0]');
      if @vString = @vString[1] then
        ShowMessage('@vString = @vString[1]');
    end;
      

  6.   

    copymemory(@a, @b[1], 4);
    在你的这条语句中解释为:把b[1]及b[2,3,4]复制给a首地址
    因为string的首地址是保留的格式,所以这样是非法的说来说去要明白还是不容易。找找感觉吧。
    最好多做做实验,什么都比不上事实更能说明一切。to moudy: 空间分配了,但具体的值没有填满。计算机最怕就是出现不能确定的值。唉~~头痛。