微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Delphi Records-创建指向它的指针

如何解决Delphi Records-创建指向它的指针

我试图查看如何创建指向简单记录的指针。

发布之前我已经搜索过类似的主题,但这很令人困惑。

我创建的A和B是实际记录。 然后,我有一个变量C,我希望它只是“指向该记录的指针”。 我不希望C存储自己的值,而只是存储指向A或B的指针。
但是每当读/写C时, 它实际上是写到A或B,无论C指向哪个。

换句话说,它就像一个指向对象的指针,但是在我的情况下我不需要对象。

使用Delphi 10.3和10.4(如有区别),请突出显示

下面的代码在第一个ShowMessage上导致访问冲突。

procedure TForm1.Button2Click(Sender: TObject);
type
  TMyRecord = record
    Field1 : integer;
  end;
var
  A : TMyRecord;
  B : TMyRecord;
  C : ^TMyRecord; // how to declare this as a pointer?
begin
  A.Field1 := 1;
  B.Field1 := 2;

  C^ := A;  // psuedo code to point to A
  A.Field1 := 3;
  showmessage( C^.Field1.ToString );   // result is 3
  C.Field1 := 4;
  showmessage( A.Field1.ToString );   // result is 4

  C^ := B;  // psuedo code to point to A
  C.Field1 := 5;
  showmessage( B.Field1.ToString );   // result is 5
  // anything to free here to avoid memory loss?
end;

解决方法

C应该包含A的地址,因此make

C := @A; 

,其余代码将根据需要运行。

还请注意,C.Field1是隐式取消引用,它实际上像C^.Field1


现在

C^ := A;

表示将A记录的内容分配给C寻址的存储区,但是未分配此存储区-这就是发生访问冲突的原因。 (要分配内存,您可以创建New(C),但这不是您所需要的)

此外,如果您要主动使用指针进行记录,则可以定义类型

PMyRecord  =  ^TMyRecord;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。