将int指针转为char指针后解引用异常,小端序下结果不符求助
问题原因分析
你搞错了后置自增运算符++的行为逻辑。
核心知识点:后置自增的求值顺序
后置自增运算符ptr++的规则是:先返回指针当前的原值,再将指针的地址加1。虽然++的优先级高于*,但后置自增的“返回原值再自增”特性,导致*ptr++的实际执行流程是:
- 读取
ptr当前指向的内存值(此时指针还未移动) - 将该值赋值给
y - 最后把
ptr的地址加1,指向内存中的下一个字节
结合你的代码逐步拆解
假设你的系统中int是4字节,变量x=0x2e1f34在小端序内存中的存储顺序是:
| 内存地址 | 存储值 |
|---|---|
| &x | 0x34 |
| &x+1 | 0x1f |
| &x+2 | 0x2e |
| &x+3 | 0x00 |
代码执行步骤:
char y = *ptr;→ptr指向&x,取到0x34,输出y=0x34(符合预期)。y = *ptr++;→ 先取ptr当前指向的0x34赋值给y,然后ptr自增到&x+1。所以这次输出还是y=0x34(这就是你觉得异常的原因)。y = *ptr++;→ 此时ptr已经指向&x+1,先取到0x1f赋值给y,然后ptr自增到&x+2。输出y=0x1f(符合预期)。
如何实现“先自增再解引用”
如果想让指针先移动到下一个字节再取值,需要使用前置自增运算符++ptr,对应的代码是:
y = *(++ptr);
这样执行顺序会变成:先将ptr自增到下一个地址,再解引用取值,就能得到你预期的0x1f作为第二个输出。
内容的提问来源于stack exchange,提问作者user9026
相关产品推荐
相关产品推荐

