为何不允许指针类型间的左值强制转换?以PE重定位为例
为什么
(char*)hdr += hdr->BlockSize无法实现指针移动? 核心原因是强制类型转换后的结果是右值,不能作为赋值操作的目标:
- 当你执行
(char*)hdr时,C语言会生成一个临时的char*类型指针副本——它只是原hdr指针值的拷贝,和原hdr变量本身无关。对这个临时值做+=操作,只会修改副本,原hdr的地址完全不会变化。 - 而
*(char**)&hdr += hdr->BlockSize的逻辑是绕开类型限制直接修改原变量:&hdr拿到hdr变量的内存地址(类型为PRELOC_BLOCK_HDR**);- 强制转换成
char**,相当于告诉编译器“这个地址里存的是一个char*类型的指针”; - 解引用
*(char**)&hdr后,操作的就是hdr变量本身(只是被当作char*类型处理); - 执行
+=时,直接修改了hdr的内存值,实现了按字节偏移的指针移动。
其实有更易读的等价写法,完全可以替代原繁琐的代码:
hdr = (PRELOC_BLOCK_HDR)((char*)hdr + hdr->BlockSize);
这种写法直接计算偏移后的地址,再强制转换回原指针类型赋值给hdr,逻辑清晰且效果一致。
内容的提问来源于stack exchange,提问作者EatingTechnobladesRemainsAt3am
相关产品推荐
相关产品推荐

