You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何不允许指针类型间的左值强制转换?以PE重定位为例

为什么(char*)hdr += hdr->BlockSize无法实现指针移动?

核心原因是强制类型转换后的结果是右值,不能作为赋值操作的目标:

  • 当你执行(char*)hdr时,C语言会生成一个临时的char*类型指针副本——它只是原hdr指针值的拷贝,和原hdr变量本身无关。对这个临时值做+=操作,只会修改副本,原hdr的地址完全不会变化。
  • 而*(char**)&hdr += hdr->BlockSize的逻辑是绕开类型限制直接修改原变量:
    1. &hdr拿到hdr变量的内存地址(类型为PRELOC_BLOCK_HDR**);
    2. 强制转换成char**,相当于告诉编译器“这个地址里存的是一个char*类型的指针”;
    3. 解引用*(char**)&hdr后,操作的就是hdr变量本身(只是被当作char*类型处理);
    4. 执行+=时,直接修改了hdr的内存值,实现了按字节偏移的指针移动。

其实有更易读的等价写法,完全可以替代原繁琐的代码:

hdr = (PRELOC_BLOCK_HDR)((char*)hdr + hdr->BlockSize);

这种写法直接计算偏移后的地址,再强制转换回原指针类型赋值给hdr,逻辑清晰且效果一致。

内容的提问来源于stack exchange,提问作者EatingTechnobladesRemainsAt3am

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 06:22:35