在Delphi 7中,我将大型缓冲区和指针定义为Byte数组。这是用于Win32 ReadEventLog调用的缓冲区。
我将第二个指针定义为缓冲区数据的记录结构。这是一个将结构添加到字节数组中的覆盖。
问题:两个指针上的数据是不同的。缓冲区^数据与RecordPtr^数据不相同。两个指针的地址是相同的。
问:声明覆盖指针的正确方法是什么?
Type
TEventRecord = record
Length : dword;
Reserved : dword;
RecordNumber : dword;
end;
TByteArray = array of byte;
Var
Buffer : TByteArray;
RecordPtr : ^TEventRecord = @Buffer;
MyData : TEventRecord;
begin
Setlength (Buffer, $FFF0);
// ReadEventLog....
// Watch of Buffer^ and RecordPtr^ shows different data
end.发布于 2016-08-09 16:58:17
动态数组Buffer: array of byte是指针,所以@Buffer是指向指针的指针。
若要对TEventRecord的内容进行每字节访问,可以指定指向字节数组数据开头的指针:
type
PEventRecord = ^TEventRecord;
var
PEventRecord_Var: PEventRecord;
begin
PEventRecord_Var := @Buffer[0]; 发布于 2016-08-09 17:00:43
你为什么不这样做呢?
Type
TEventRecord = record
Length : dword;
Reserved : dword;
RecordNumber : dword;
end;
TEventLog = array of TEventRecord ;
Var
Buffer : TEventLog;
begin
Setlength (Buffer, $FFF0);
// ReadEventLog(@buffer[0],...)
end.发布于 2016-08-09 19:49:15
你可以像这样实现你想要的目标:
Var
Buffer : TByteArray;
RecordPtr : ^TEventRecord absolute Buffer;这使得两个变量在内存中占据相同的4个字节(或64位中的8个字节)。
https://stackoverflow.com/questions/38856027
复制相似问题