编写了一个带PBYTE参数的函数,调用时,发现参数并没有传递进来,指针没有指向规定的内容,请问原因何在。
发现b指向的第一个内容显示为D0,为何不是EB
请各位赐教,多谢多谢!
函数如下:
function  Initial(buf:Pbyte;var buflength:longint):longint;
var
  s:array[0..15]of byte;
  p:pbyte;
begin
  buflength:=0;
  result:=0;
  try
   s[0]:=$EB;
   s[1]:=$90;
   s[2]:=$82;
   s[3]:=$00;
   s[4]:=$00;
   s[5]:=$00;
   s[6]:=$00;
   s[7]:=$00;
   s[8]:=$00;
   s[9]:=$00;
   s[10]:=$00;
   s[11]:=$00;
   s[12]:=$00;
   s[13]:=$00;
   s[14]:=$00;
   s[15]:=$00;
   buf:=Pbyte(@s);
   buflength:=16;
  except
      result:=99;  //未知错误
  end;
end;
调用函数如下:
procedure TForm1.Button1Click(Sender: TObject);var
    bufLength:longint;
    r:longint;
    b:pbyte;
    s1:array[0..15]of byte;
begin
   getMem(b,16);
   r := Initial(b,bufLength);
   s1[0]:=b^;
   edit1.Text:=inttostr(r);
   edit2.Text:=inttostr(buflength);
   edit3.Text:=format('%.2x',[b^]);
   freemem(b);
end;

解决方案 »

  1.   

    把函数体内的buf:=Pbyte(@s);这句改为
      CopyMemory(buf, @s[0], 16);注意,局部变量s:array[0..15]of byte;这是在栈上分配空间的,当函数返回,栈顶修复,局部变量已经不存在了(尽管其值可能还在)
      

  2.   

     非常感谢,太厉害了
    更改后,可行,可是 我想调用函数后,再验证显示指针所指向的内容是否是'EB 90 82 00...'现在我在调用函数中将指针所指内容重新赋给一个数组 以方便显示,但是又出问题了 请问是不是还是跟所说的这个局部变量有关系呢,谢谢!
    函数调用如下:
    procedure TForm1.Button1Click(Sender: TObject);var
        bufLength:longint;
        r:longint;
        b:pbyte;
        s1:array[0..15]of byte;
    begin
       getMem(b,16);
       r := Initial(b,bufLength);
       s1[0]:=b^;
       inc(b);
       s1[1]:=b^;
       inc(b);
       s1[2]:=b^;
       edit1.Text:=inttostr(r);
       edit2.Text:=inttostr(buflength);
       edit3.Text:=format('%.2x %.2x ',[s1[0],s1[1]]);
       freemem(b);
    end;
    end.
      

  3.   

    再copymemory一次不就行了
    CopyMemory(@s1, b, 16);
      

  4.   

    回#2楼
    procedure TForm1.Button1Click(Sender: TObject);
    var
      bufLength:longint;
      r:longint;
      b:pbyte;
      s1:array[0..15]of byte;
    begin
      //getMem(b,16);
      r := Initial(@s1[0],bufLength);
      edit1.Text:=inttostr(r);
      edit2.Text:=inttostr(buflength);
      edit3.Text:=format('%.2x %.2x ',[s1[0],s1[1]]);
      //freemem(b);
    end;
      

  5.   

    再回复#2楼你那样操作指针b(连续自加,b值已非GetMem时的起始位置),在FreeMem时,肯定会出错如果不愿用4楼那样,就用这样:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      bufLength:longint;
      r:longint;
      b: PByte;
    begin
      getMem(b,16);
      r := Initial(b,bufLength);
      edit1.Text:=inttostr(r);
      edit2.Text:=inttostr(buflength);
      edit3.Text:=format('%.2x %.2x %.2x',[ b^, PByte(Integer(b)+1)^, PByte(Integer(b)+2)^ ]);
      freemem(b);
    end;
      

  6.   

    GetMem返回的无类型指针是否允许自加?这我没试,或许连这里都有问题。或者你这样(注意,多了一个指针p):多种写法,供你选择
    procedure TForm1.Button1Click(Sender: TObject);
    var
      bufLength:longint;
      r:longint;
      b:pbyte;
      p:Pointer;
      s1:array[0..15]of byte;
    begin
      getMem(p,16);
      r := Initial(p,bufLength);
      b := p;
      s1[0]:=b^;
      inc(b);
      s1[1]:=b^;
      inc(b);
      s1[2]:=b^;
      edit1.Text:=inttostr(r);
      edit2.Text:=inttostr(buflength);
      edit3.Text:=format('%.2x %.2x %.2x',[s1[0],s1[1],s1[2]]);
      freemem(p);
    end;
      

  7.   

    别嫌烦,耐心一楼一楼地看,看出不同下面是最接近你自己写法的修改方法
    procedure TForm1.Button1Click(Sender: TObject);
    var
      bufLength:longint;
      r:longint;
      b:pbyte;
      s1:array[0..15]of byte;
    begin
      getMem(b,16);
      r := Initial(b,bufLength);
      s1[0]:=b^;
      inc(b);
      s1[1]:=b^;
      inc(b);
      s1[2]:=b^;
      edit1.Text:=inttostr(r);
      edit2.Text:=inttostr(buflength);
      edit3.Text:=format('%.2x %.2x %.2x',[ s1[0],s1[1],s1[2] ]);
      dec(b,2);{注意这里!错误就出在这里,也就是在5楼说的:你那样操作指针b(连续自加,b值已非GetMem时的起始位置),在FreeMem时,肯定会出错}
      freemem(b);
    end;