我用的是d7
是这样的,两个memo里面有字符串
type
a=record
 s:pchar;
 x:pchar;
end;
b=record
 s:string;
 x:string;
end;
var
 aa:array[0..10]of a;
bb:array[0..10]of b;
cc:arrar[0..30]of pchar;
..............for n:=0 to 9 do
 begin
  aa[n].s:=pchar(memo1.line[n]);  aa[n].x:= pchar(memo2.line[n]);
  bb[n].s:=pchar(memo1.line[n]);  bb[n].s:=pchar(memo2.line[n]);
 cc[n]:=pchar(memo1.line[n]);   cc[n+10]:=pchar(memo2.line[n]);
end;
结果aa是混乱的数据,bb和cc是预期的结果。
aa中各pchar值没有变,但指向的内容变了
为什么?

解决方案 »

  1.   

    我想是這樣的原因,record一開始你就分配了內存空間,它是一個內存块,而pchar類型是以null結尾的字符串,record估計是沒順序。所以才混乱的数据吧。
      

  2.   

    2楼,pchar 是指向null結尾的字符串的指针
    aa中pchar的值和bb中相应位置的是一样的
    但是……
      

  3.   


    StrPcopy(aa[n].s,Memo1.Lines)
      

  4.   

    个人观点,不一定对!原因:
    s:pchar; 
    在结构体中声明s时,编译器为其分配了一个地址
    而s:=PChar(Memo1.Lines[1])时
    Delphi不是简单地将Memo1.Lines[1]中的字符串拼接到在结构体中刚刚申请的堆地址上,而是做了如下动作!
    1.GetMem()//重新创建一块内存,长度为Length(Memo1.Lines[1])
    2.s=@(Memo1.Lines[1])把刚分配的堆首址发给栈变量s
    这时在结构体中声明的PChar的指向已不是刚刚分配内存的指向了结论:
    要想避免这种情况,我们自然就想到把Memo1.Lines拼接到PChar后,而不用新创建一块内存单元!
    能实现这种功能有几种方法:比如:Move\CopyMemory\StrpCopy等