POINTER位大小

问题描述

CODESYS documentation

即使指针是64位指针,即使在64位平台上,两个指针之间的差异结果也是DWORD类型。

据此,我猜想codesys中的指针在x86平台上是32位,在x64平台上是64位。这是真的吗?

我尝试在模拟模式( CODESYS 3.5 SP16 )中运行CODESYS_Control_Win_V3CODESYS_Control_Win_V3 x64,在两种情况下,指针都是64位的,但是我没有真正的x84 PLC(仅x64),因此我无法在真实设备上进行验证。可以使用x86 PLC的人对此进行测试并将结果告诉我吗?

编辑:奇怪的是,我打开了2个独立的项目,在两个项目中我都尝试了ptr := ptr + {some DINT variable};,其中一个项目得到了警告Implicit conversion from signed Type 'DINT' to unsigned Type 'LWORD',而在另一个项目中得到了Implicit conversion from signed Type 'DINT' to unsigned Type 'DWORD'

enter image description here

enter image description here

EDIT2:我在一个测试项目中尝试过:

    p: POINTER TO STRING := ADR(str);
    pp: POINTER TO POINTER TO STRING := ADR(p);
    sizep: DINT := SIZEOF(p);     // evaluates to 8
    sizepp: DINT := SIZEOF(pp);   // evaluates to 8

这是否意味着它们总是 8个字节?

解决方法

指针的大小在32位运行时为4字节,在64位运行时为8字节。

在文档中找到的句子只是说,当您执行2个指针的区别时,编译器期望DWORD。 意思是,当您尝试执行以下操作时,将收到该警告:

diTest := pTest - pTest2;

diTest是DINT,pTest和pTest2是两个指针。

这也意味着,如果在64位系统上使用DWORD作为2个指针之差的结果分配,则可能会丢失一些信息。 实际上,您将丢失4个字节。

DWORD长4个字节,而64位系统上的指针长8个字节。

为了以跨平台的方式存储指针的地址,请使用PVOID类型,该类型在32位系统上为4字节,在64位系统上为8字节。 PVOID在CAA类型库中可用。

或者,您可以使用__XWORD,因为PVOID是__XWORD的别名,在64位平台上,它转换为LWORD,而在32位平台上,则转换为DWORD。