极惑,关于Delphi帮助中的FileRead()函数的Example(200分)

  • 主题发起人 主题发起人 张一健
  • 开始时间 开始时间

张一健

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi帮助中的FileRead函数的Example有哪位朋友试过,会出现非法指针错误。
跟踪下来,发现执行FileRead()函数后,Buffer变为无效指针。
何解?欢迎大家踊跃发言。

procedure TForm1.Button1Click(Sender: TObject);
var
iFileHandle: Integer;
iFileLength: Integer;
iBytesRead: Integer;
Buffer: PChar;
i: Integer;
begin
if OpenDialog1.Execute then
begin
try
iFileHandle := FileOpen(OpenDialog1.FileName, fmOpenRead);
iFileLength := FileSeek(iFileHandle,0,2);
FileSeek(iFileHandle,0,0);
Buffer := PChar(AllocMem(iFileLength + 1));
iBytesRead := FileRead(iFileHandle, Buffer, iFileLength);
FileClose(iFileHandle);

for i := 0 to iBytesRead-1 do
begin
StringGrid1.RowCount := StringGrid1.RowCount + 1;
StringGrid1.Cells[1,i+1] := Buffer;
StringGrid1.Cells[2,i+1] := IntToStr(Integer(Buffer));
end;
finally
FreeMem(Buffer);
end;
end;
end;
 
Example有问题
FileRead实际传递的是指针,而Buffer由于需要动态分配内存,所以Buffer变量实际代表Buffer本身的地址指针,传递给
FileRead后,结果读的内容把修改了Buffer所指向的内存地址,结果自然乱套了
这里要传递的应该是Buffer的内容(所指向的地址),所以要用Buffer[0],不能用Buffer
改成 iBytesRead := FileRead(iFileHandle, Buffer[0], iFileLength);
就OK了
Delphi里的指针(包括不是指针实际是指针的东东)的确让人头痛,连他们自己人都犯混,
所以建议能不用指针,就不用指针
 
后退
顶部