type
     pmytype  =  ^mytype ;
    
     mytype = record
       data :string ;
       next :pmytype;
     end;{上面是定义 }
var
  tmp : pmytype;
  str : string ;
begin
  str := 'asdcgdefete' ;
  
 tmp := pmytpe(AllocMem(Length(str) + 4));   {这样申请内存空间是否有问题?}
 tmp^.data := str ;  {这样赋值是否有问题?}
 tmp^.next := nil;
 FreeMem(tmp);
end;请问我上面定义和使用自定义类型的数据是否有错,如果有错,错在哪里,如何解决? 谢谢

解决方案 »

  1.   

    分配内存用new比较好吧!
    var
      tmp : PMytype;
    begin
      new(tmp);
      tmp.Data := 'dsafdsf';
      new(tmp.next);
      tmp.next.Data := 'dsafsdf';  showMessage(tmp.data);
      showMessage(tmp.next.data);
      FreeMem(tmp.next);
      FreeMem(tmp);
    end;
      

  2.   

    type  PListEntry = ^TListEntry;
      TListEntry = record
        Next: PListEntry;
        Text: string;
        Count: Integer;
      end;
    var
      List, P: PListEntry;
    begin
      ...
      New(P);
      P^.Next := List;
      P^.Text := 'Hello world';
      P^.Count := 1;
      List := P;
      ...
     Dispose(P);
    end;
      

  3.   

    你申请内存空间的做法是有问题,事实上sizeof(myType)=8长度仅为8,很可能str : string 也只是一个指针,事实上string也是一个结构体
    String {  
        WORD   wLength; 
        WORD   wValueLength; 
        WORD   wType; 
        WCHAR  szKey[]; 
        WORD   Padding[]; 
        String Value[]; 
    } String; 
    //测试数据
    sizeof(myType)=8;
    str := 'asdcgdefete' ;
    length(str)+4=15;
    //用法
      tmp:=new(pmytype);
      tmp.data:='Only for test';
      edit1.Text:=tmp.data;
      dispose(tmp);
      

  4.   

    type
         pmytype  =  ^mytype ;
        
         mytype = record
           data :string ;  {我的数据从1--2048字节都有可能,这里改如何解决?}
           next :pmytype;
         end;
      

  5.   

    就是说 pmyType 的每个变量的大小都有可能不同。那么在分配的时候可以指定内存的大小,在回收的时候是否也要指定内存的大小呢?