gpt4 book ai didi

Delphi CompareMem 与指针

转载 作者:行者123 更新时间:2023-12-03 15:42:10 24 4
gpt4 key购买 nike

我一直在使用 DUnit 作为 TDD 驱动程序在 Delphi 5 中开发一些软件,但我发现当使用 CheckEqualsMem 时它一直失败,即使在调试器中我可以看到正在比较的对象(此中的两个长字数组)情况)相同。

在内部,CheckEqualsMem 使用 CompareMem 并发现这就是返回 false 的原因。

深入研究一下,我发现如果我使用 @ 或 Addr 使用指向对象地址的指针来调用 CompareMem,即使内存相同,CompareMem 也会失败,但如果我使用 PByte(来自 Windows)或 PChar,它将进行比较内存正常。

为什么?

这是一个例子

var
s1 : String;
s2 : String;
begin
s1 := 'test';
s2 := 'tesx';

// This correctly compares the first byte and does not return false
// since both strings have in their first position
if CompareMem(PByte(s1), PByte(s2), 1) = False then
Assert(False, 'Memory not equal');

// This however fails ?? What I think I am doing is passing a pointer
// to the address of the memory where the variable is and telling CompareMem
// to compare the first byte, but I must be misunderstanding something
if CompareMem(@s1,@s2,1) = False then
Assert(False,'Memory not equal');

// Using this syntax correctly fails when the objects are different in memory
// in this case the 4th byte is not equal between the strings and CompareMem
// now correctly fails
if CompareMem(PByte(s1),PByte(s2),4) = False then
Assert(False, 'Memory not equal');
end;

正如你在评论中看到的,我来自 C 背景,所以我认为 @s1 是指向 s1 第一个字节的指针,和 PByte(s1) 应该是同一件事,但事实并非如此。

我在这里误解了什么? @/Addr和PByte有什么区别??

最佳答案

区别在于,@s1 是变量 s1地址,而 PByte(s1) 是变量s1

字符串变量内部是一个指向字符串数据的指针,因此@s1是一个指向指针的指针。线路

CompareMem(@s1,@s2,1);

比较s1s2字符串地址的两个最低有效字节;它没有任何意义,并且与 Pointer(s1)Pointer(s2) 引用的字符串数据没有关系。

关于Delphi CompareMem 与指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15255885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com