type
  pTStruct = ^TStruct;
  TStruct = record
    arr: array[0..9] of char;
  end;
procedure TForm1.Button7Click(Sender: TObject);
var
  a: pTStruct;
  arr: array[0..9] of char;
begin
  new(a);
  FillChar(a^,SizeOf(a^),#0);
  StrCopy(a^.arr,PChar(Trim('1234567890')));
  ShowMessage(Trim(a^.arr));
  dispose(a);
end;为什么当显示ShowMessage(Trim(arr));是会出错,
而当用指针时就不出错呢?不明白

解决方案 »

  1.   

    ShowMessage(Trim(arr));不会出错,但它可能不是你想要的,因为这时的arr是局部变量(begin前面声明的那个),它一直没有被赋值,是一些随机数据
      

  2.   

    ShowMessage(Trim(arr));

    ShowMessage(Trim(a^.arr)); 
    这两句里的“arr”完全是两码事,arr是局部数组,a^.arr是记录体a^里的数组元素
      

  3.   

    不知道楼主想要说明什么问题!
    ShowMessage(Trim(a^.arr)); //其中的a^.arr为结构体中的一个成员,已通过StrCopy赋值
    ShowMessage(Trim(arr));//其中的arr为一个局部的变量
      

  4.   

    因为是Pchar类型,所以可用showmessage(pchar(...))
      

  5.   

    可能我没说明白,我再解释下,就是对于数组来说,为什么赋值时要在结尾加个结束符位置。
    如果没有结束符位,可能会出错。例如:
    procedure TForm1.Button7Click(Sender: TObject); 
    var
      arr: array[0..9] of char;
    begin
      strcopy(arr,'1234567890');
      ShowMessage(Trim(arr));
    end; 你们可以运行下这个例子,会报错,为什么???? 
      

  6.   

    回7楼:一、你当然是没说明白。二、不要乱用StrCopy,它的参数使用PChar指针,却不明确字符序列的长度,因此只有遇到#0才结束拷贝(我没有细心研究StrCopy的那段汇编码,暂这样猜测),这样很危险。
    建议使用下面这种方法:
    var
      arr: array[0..9] of char;
    begin
      CopyMemory(@arr[0],@'1234567890'[1],Length(arr));
      ShowMessage(StrPas(@arr[0]));
    end;
    三、用上面的代码虽然不会出错,但因为没有指定字符串结束符的位置,所以会出现乱码。可以这样:
    var
      arr: array[0..9] of char;
    begin
      CopyMemory(@arr[0],@'123456789'#0[1],Length(arr));
      ShowMessage(StrPas(@arr[0]));
    end;
      

  7.   


    出错的原因是: array[0..9] of char; 这个char数组是容不下PChar('1234567890')这个C字符串的, 因为C字符串必须是以#0结尾的, 所以PChar('1234567890')是需要11个字节的存储空间。
    改成 arr: array[0..10] of char; 就不会出错了。
      

  8.   

    续8楼:根据楼主在7楼的描述,猜想楼主的本意是:
    为什么用new()分配的p^.arr可以不出错,而过程中声明的局部变量array[0..9]of char虽然同样长度,却会报错?在这里说一下:两个都很危险,仅仅是new()分配的未报错而已。为什么未报错(是不是因为“堆”、“栈”的不同导致,这需要仔细研究)暂不讨论,先让楼主看一下使用StrCopy操作的危险:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      a: pTStruct;
      arr1: array[0..9] of char;
      aa: TStruct;{用这种方式声明的局部变量,与arr1一样会报错。这个不演示了}
      p1,p2: ^Char;
    begin
      new(a);
      Integer(p1) := Integer(@a^.arr[9])+1;{最后一个元素地址加1}
      Integer(p2) := Integer(p1)+1;{最后一个元素地址加2}
      Showmessage(p1^+p2^);{看一下是什么结果。再看一下执行StrCopy后是什么结果}
      StrCopy(a^.arr,PChar(Trim('1234567890ab')));{多出两个字符}
      Showmessage(p1^+p2^);{看一下现在是什么结果。应该是'ab'。危险吧?!}
      ShowMessage(a^.arr);
      dispose(a);
    end;
      

  9.   

    9楼秀峰说得很到位.同样,如10楼,arr:array[0..9]of char的字符序列占10个字节,用StrCopy将PChar('0123456789')拷贝到arr[0]起始的一段内存中去,会将PChar('0123456789')最末尾隐含的一个#0拷贝到arr[10]的位置(越界).
      

  10.   

    9楼秀峰说得很到位.同样,如10楼,arr:array[0..9]of char的字符序列占10个字节,用StrCopy将PChar('0123456789')拷贝到arr[0]起始的一段内存中去,会将PChar('0123456789')最末尾隐含的一个#0拷贝到arr[10]的位置(越界).
      

  11.   


    StrCpy does not perform any length checking. The destination buffer must have room for at least StrLen(Source)+1 characters.
      

  12.   

      arr: array[0..9] of char; 
    begin 
      strcopy(arr,'1234567890'); 
      ShowMessage(Trim(arr)); '12345670' 后边有个换行符, 要11个字节来保存
      arr: array[0..10] of char;