编写了一个带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;
发现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;
CopyMemory(buf, @s[0], 16);注意,局部变量s:array[0..15]of byte;这是在栈上分配空间的,当函数返回,栈顶修复,局部变量已经不存在了(尽管其值可能还在)
更改后,可行,可是 我想调用函数后,再验证显示指针所指向的内容是否是'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.
CopyMemory(@s1, b, 16);
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;
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;
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;
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;