PBuffer :=AllocMem(1024);//这里分配1024,看任务管理器,并没有1024这么大,是不是虽然分配了,但是没有利用,就不会用这么大?
PBuffer,如何给这个针数据赋值呢?比如在它的数据头赋值个Boolean型,然后紧跟其后赋值个integer?  最后可以读出这两个值。

解决方案 »

  1.   

    第一个问题,牵涉2个方面,第一Windows并不是你一申请就马上给你分配内存,而是使用申请的内存才真实的分配(又叫映射,这要看Windows版本,Vista后是这样,XP的情况没作测试)
    这个可以用如下代码验证:var
      P : Pointer;//当点了Button1后,程序占用的内存并未增加
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      GetMem(P , 50 * 1024 * 1024);
    end;
    //当使用这片内存时,内存就真实的从Winows分配物理内存并映射了
    //点了Button2后,程序使用内存增加了大概50M
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      FillChar(P^ , 50*1024*1024 , 0);
    end;
    //释放
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      FreeMem(P);
    end;
    第二,Delphi的程序由自己的内存管理体系详见GETMEM.INC代码,你申请1024字节,但是内存管理发现现在已经有200空闲字节,那么就只需要延伸多余部分即可,所以增加的并不一定就是1024.第2个问题,指针赋值的问题一般这么写var
      P : PAnsiChar;
    begin
      GetMem(P , ...
      FillChar(P^ , ....
      PBoolean(P)^ := True;    //第1个字节
      PInteger(P+1)^ := 100;   //第2,3,4,5字节
      //类推,最好的是定义一个对应的结构来处理
    end;
    Type
      PRecFire = ^TRecFire;
      TRecFire = packed record
        B : Boolean;           //第一个字节
        i : integer;           //第2,3,4,5字节
         //.....
      end;var
      P : PRecFire;
    begin
      GetMem(P , ...
      FillChar(P^ , ....
      P.B := True;    //第1个字节
      P.i := 100;   //第2,3,4,5字节
      ...
    end;
      

  2.   

    用结构的话好像不方便
    我现在要做的事,分配的内存指针数据。取第一位,判断其Boolen值,如果是假,就放弃。如果是真
    那么标记为假,然后将指针后移一位,返回其后移一位的地址。
      

  3.   


    function TForm1.Move2(S: Pointer):Pointer;
    var
      F:Boolean;
      B:Pointer;
    begin
      CopyMemory(@F,s,1);
      if not  F then
        b:=nil
      else
      begin
     ////怎么写?
      end;
    end;
      

  4.   


    function TForm1.Move2(S: Pointer):Pointer;
    var
      F:Boolean;
      B:Pointer;
      a:Integer;
      a2:Integer;
    begin
      CopyMemory(@F,s,1);
      if not  F then
      begin
        b:=nil;
        Result :=b;
      end
      else
      begin
        a:=Integer(Cardinal(S));
        a2:=a-1;
        b:=@Cardinal(a2);
      end;
    end;不知道有没有问题