为什么不允许将 PChar 的内容打印为指针
Why it's not allowed to print the content of PChar as a pointer
我有以下程序。
var a: PChar := PChar('abc');
ShowMessage(Format('%p - %p', [@a, a]));
当我 运行 它时,我得到了这个错误:
Project Project1.exe raised exception class EConvertError with message 'Format '%p - %p' invalid or incompatible with argument'.
问题是 a
无法格式化为 %p
。但据我了解,PChar 被定义为^Char
。所以 PChar 本质上是指向 Char 的指针。这是一个指针。为什么不能格式化为%p
?以下代码可以正常工作:
var c: Char := 'x';
var a := @c;
Format('%p - %p', [@a, a]); // 0019F364 - 0019F36A
Format()
的最后一个参数是一个array of const
(本质上是一个TVarRec
的数组)。有类型的 PChar
指针存储在 TVarRec.VPChar
字段 (TVarRec.VType=vtPChar
) 中,而无类型的指针存储在 TVarRec.VPointer
字段 (TVarRec.VType=vtPointer
) 中。仅 VPointer
字段支持 %p
说明符。 VPChar
字段仅支持 %s
说明符。
因此,如果您想使用 %p
.
,则必须 type-cast PChar
到 Pointer
我已就此事向 Embarcadero 提交了一份报告:
RSP-37775: Update SysUtils.Format() to allow %p for all types of pointers
我有以下程序。
var a: PChar := PChar('abc');
ShowMessage(Format('%p - %p', [@a, a]));
当我 运行 它时,我得到了这个错误:
Project Project1.exe raised exception class EConvertError with message 'Format '%p - %p' invalid or incompatible with argument'.
问题是 a
无法格式化为 %p
。但据我了解,PChar 被定义为^Char
。所以 PChar 本质上是指向 Char 的指针。这是一个指针。为什么不能格式化为%p
?以下代码可以正常工作:
var c: Char := 'x';
var a := @c;
Format('%p - %p', [@a, a]); // 0019F364 - 0019F36A
Format()
的最后一个参数是一个array of const
(本质上是一个TVarRec
的数组)。有类型的 PChar
指针存储在 TVarRec.VPChar
字段 (TVarRec.VType=vtPChar
) 中,而无类型的指针存储在 TVarRec.VPointer
字段 (TVarRec.VType=vtPointer
) 中。仅 VPointer
字段支持 %p
说明符。 VPChar
字段仅支持 %s
说明符。
因此,如果您想使用 %p
.
PChar
到 Pointer
我已就此事向 Embarcadero 提交了一份报告:
RSP-37775: Update SysUtils.Format() to allow %p for all types of pointers