获取struct var AKA的位置记录字段的偏移量

Ben*_*iss 4 delphi struct memory-management record delphi-7

我想得到一个结构/记录的"位置".

说我有这个记录:

type
  MyStruct = record
    MyInteger   : Integer;
    MyInteger2  : Integer;
    MyInteger3  : Integer;
    MyFunc      : function (FirstParam : WideString; SecondParam : String) : Integer;
    MyString    : String;
    MyString2   : WideString;
    MyPchar     : pchar;
end;
Run Code Online (Sandbox Code Playgroud)

如您所见,此记录的大小为28字节(7个字符x 4个字节).基本上因为所有变量都是4字节变量(如整数)或指针(也是4字节).现在假设我们将这个结构加载到一个内存地址(X = 0)(这也意味着MyInteger的地址为0).MyInteger3的地址(例如)将为8(请注意X = 0!)如何动态获取结构的位置(数字/地址)?

希望你们知道我的意思吗?提前致谢.

BTW:结构中任何Var总是4个字节吗?编辑:如果你修复spcae这是错误的:String[100]

Rem*_*eau 9

您可以使用某些指针算法获取任何记录成员的偏移量:

type
  PMyStruct = ^MyStruct;

var
  Offset: Integer;
begin
  Offset := Integer(@(PMyStruct(nil).MyInteger3));
  // or:
  // Offset := Integer(Addr(PMyStruct(nil).MyInteger3));
end;
Run Code Online (Sandbox Code Playgroud)

如果你想要函数的偏移量,你需要像这样编码:

Offset := Integer(@@PMyStruct(nil).MyFunc);
// or:
// Offset := Integer(Addr(@PMyStruct(nil).MyFunc));
Run Code Online (Sandbox Code Playgroud)


Wou*_*ick 7

program OffsetTest; {$APPTYPE CONSOLE}

type
  f = function (FirstParam : WideString; SecondParam : String) : Integer;
  TStruct = record
    MyInteger   : Integer;
    MyInteger2  : Integer;
    MyInteger3  : Integer;
    MyFunc      : ^f;
    MyString    : String;
    MyString2   : WideString;
    MyPchar     : pchar;
  end;

var MyStruct :TStruct;

begin
  Writeln( int64(@(MyStruct.MyInteger )) - int64(@(MyStruct)));
  Writeln( int64(@(MyStruct.MyInteger2)) - int64(@(MyStruct)));
  Writeln( int64(@(MyStruct.MyInteger3)) - int64(@(MyStruct)));
  Writeln( int64(@(MyStruct.MyFunc    )) - int64(@(MyStruct)));
  Writeln( int64(@(MyStruct.MyString2 )) - int64(@(MyStruct)));
  Writeln( int64(@(MyStruct.MyPchar   )) - int64(@(MyStruct)));
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)

32位版本的结果:

0 
4 
8
12
20
24
Run Code Online (Sandbox Code Playgroud)

64位版本的结果:

0
4
8
16
32
40
Run Code Online (Sandbox Code Playgroud)

结果为64位,打包记录:

0
4
8
12
28
36
Run Code Online (Sandbox Code Playgroud)

显示不同的结果,指出在代码中依赖这些偏移量可能是个坏主意.或者至少要非常清楚不同情况可能导致不同的偏移.