C++中pointer与&pointer的区别及对应C#实现方式咨询
问题解答
1. C++中变量前&符号的作用
这里的&是C++的取地址运算符,作用是获取目标变量在内存中的存储地址,而非变量本身存储的数值。
你给出的示例中三个变量的本质区别为:
test1:直接读取dwPointer中存储的数值,因为dwPointer初始赋值为0,所以取值为0test2:将dwPointer存储的数值强制转换为无类型指针,数值还是0,所以得到空指针0x0test3:获取dwPointer这个变量本身在内存中的存放地址,和dwPointer里存的0没有任何关联
2. C#对应复现代码
C#默认是安全运行上下文,不允许直接操作指针,要复现上述逻辑需要使用不安全代码,首先要在项目编译选项中开启「允许不安全代码」,对应代码如下:
unsafe static void Main(string[] args) { // ulong对应C++的DWORD64(64位无符号整数) ulong dwPointer = 0; long test1 = (long)dwPointer; // 取值为0 // IntPtr对应C++的LPVOID(指针类型) IntPtr test2 = (IntPtr)dwPointer; // 取值为0x0000000000000000 IntPtr test3 = (IntPtr)(&dwPointer); // 取变量内存地址,每次运行值不同 Console.WriteLine($"test1: {test1}"); Console.WriteLine($"test2: 0x{test2:X16}"); Console.WriteLine($"test3: 0x{test3:X16}"); }
3. 地址每次重启程序变化的原因
这个现象和变量本身存储的数值无关,是操作系统的**地址空间布局随机化(ASLR)**安全机制导致的:
现在主流操作系统(Windows、Linux、macOS)默认都会开启ASLR,程序每次启动时,操作系统会随机偏移程序的栈、堆、核心模块的加载基址,避免攻击者利用固定内存地址执行漏洞利用代码。
你的示例中dwPointer是栈上的局部变量,程序每次启动时栈的基地址都会被ASLR随机调整,所以这个变量的存储地址每次运行都会发生变化。
内容的提问来源于stack exchange,提问作者Discord Programs
相关产品推荐
相关产品推荐

