分配内存用new(p)
释放时用dispose(p),试试看
读的时候:
puserinfo(p)^.username
...
应该可以

解决方案 »

  1.   

    var
      pl:pchar;   
        getmem(p,sizeof(tuserinfo));
        p.username:='kkk';
        p.HeadIcon:=65;
        p.sockethandle:=65;
        showmessage(inttostr(sizeof(tuserinfo)));
        showmessage(inttostr(sizeof(p)));
        pl:=pchar(P);
        while true do
        begin
        showmessage(pchar(pl)^);
        pl:=pchar(pl)+1;
        end;
        freemem(p);就可以看到内容了为什么不能用
    freemem 我还没有找到答案
      

  2.   

    有办法了
    在freemem前加上
    buf:=nil;因为此时buf指的地方仍有引用,如:p
    不能直接释放
      

  3.   

    直接用nil系统会回收占用的内存吗,好象不会吧。
      

  4.   

    问题的关键就在这里:    getmem(buf,sizeof(tuserinfo)+3);//你分配了一块空间给buf
        buf:=pchar('$;@'+pchar(P));//你把一个指针传给了buf,那么你分配的
                                     那块内存地址怎么找的回来?
                                     好像是白分配了
        showmessage(pchar(buf));这样如何?var
        buf:pointer;
        p:puserinfo;
    begin
        getmem(p,sizeof(tuserinfo));
        p.username:='kkk';
        p.HeadIcon:=44;
        p.sockethandle:=43;
      //  getmem(buf,sizeof(tuserinfo)+3);
        buf:=pchar('$;@'+pchar(P));
        showmessage(pchar(buf));
      //  freemem(buf);  //为什么不能free,我想把buf中的userinfo读出来又该怎么做
        freemem(p);
    end;
      

  5.   

    问题解决了,我觉得这个问题很有意思的。type
        TName=array[0..9] of char;
        PuserInfo=^TUserInfo;
        TUserInfo=record
            UserName:tname;
            HeadIcon:byte;
            SocketHandle:Integer;
        end;procedure TForm1.Button1Click(Sender: TObject);
    var
        buf:pointer;
        p,p1:puserinfo;
        f,f1:^tname;
    begin
        getmem(p,sizeof(tuserinfo));
        getmem(buf,sizeof(tuserinfo)+10);    f:=buf;
        f^:='hi delphi ';
        p:=ptr(longint(buf)+10);
        p.username:='Mydelphi';
        p.HeadIcon:=44;
        p.sockethandle:=43;    p1:=ptr(longint(buf)+10);
        f1:=buf;    showmessage('buf='+pchar(buf));
        showmessage('f1='+f1^);
        showmessage('p.username='+p1.UserName);
        showmessage('p.headicon='+inttostr(p1.headicon));
        showmessage('p.sockethandle='+inttostr(p1.sockethandle));
        freemem(buf);
    end;
      

  6.   

    对嘛!
    这样才是真正用到了分配给buf的内存,当然可以释放了.
    以前那样,根本不用给buf分配空间的,代码中就没有用到分配的空间.buf:=pchar('$;@'+pchar(P));//这句后.这块分配的内存就再也找不到了,呵呵
      

  7.   

    开始没有new内存给buf,所以不能free了!!
      

  8.   

    1、建议buf的类型为pchar;
    2、你不能用“buf := ”去改变buf指向的内容,这样只能让它重新指向另一片存储区(在这一段程序中,应该是一个临时分配的存储区),你应该复制内存:
    StrLCopy( PChar(buf), '$;@' );
    MemMove( p^, PChar(buf)^, sizeof(TUserInfo) );读出buf中的TUserInfo: PUserInfo(buf+3)^
      

  9.   

    谢谢各位,不过问题还没解决,先结了,请各位到以下地址继续,200分哦。
    http://www.csdn.net/expert/topic/939/939025.xml?temp=1.676577E-02