【发布时间】:2021-10-03 00:29:52
【问题描述】:
所以我对 C++ 有点陌生,我有以下代码:
DWORD64 dwPointer = 0;
long test1 = dwPointer; //equals 0
LPVOID test2 = (LPVOID)dwPointer; //equals 0x0000000000000000
LPVOID test3 = &dwPointer; //equals 0x000000a5038ff068 (result changes after each restart)
所以如果我调试它,test1 和 test2 基本上都等于 0。 但是为什么每次我重新启动程序时test3的值都会改变。 指针的 & 前面有什么作用?
还可以在 C# 中复制完全相同的示例吗?我必须使用哪个代码,我只是想了解发生了什么,因为我是 C# 用户,我想知道预定义的 DWORD64 = 0 值如何在每次重新启动后更改为不同的值,即使没有在代码中分配这些新值?
【问题讨论】:
-
dwPointer是一个DWORD64(在窗口 API,IIRC 中通常是unsigned long),值为零。(LPVOID)dwPointer将该零值转换为指针,因此产生一个空指针。&dwPointer是dwPointer在内存中的地址,即变量的值为零,并且在内存中的地址(不会为零)。您的代码不会更改dwPointer的值,并且在“重新启动”之后不会更改。然而,该变量的地址取决于操作系统如何为进程分配内存。 -
“也可以在 C# 中复制完全相同的示例吗?” 没有。
-
“预定义的 DWORD64 = 0 值如何更改为不同的值” - 正如您所演示的那样,它不会。每次使用
DWORD64值(称为dwPointer)时,该值都为零。当您将运算符应用于dwPointer,特别是&运算符时,您会得到不同的结果。大多数运算符的目的是将一个值转换为其他值,因此operator&产生的值不是dwPointer也就不足为奇了。 (结果值随每次重启而变化的事实可能令人惊讶,但结果不为零这一事实并不令人惊讶。) -
在 c# 中,您可以使用 Marshaling 类来处理非托管内存。