我在解除指向指针的值时面临一个问题。
考虑以下功能可以正常工作:
void encode(int32_t *pInput, unsigned char **ppOutput)
{
**(int32_t **)ppOutput = *(int32_t*)pInput;
*ppOutput += sizeof(int32_t);
}
现在,当我尝试取消引用该值时,使用如下的反向逻辑:
void decode(unsigned char **ppInput, int32_t *pOutput)
{
*(int32_t *)pOutput = **(int32_t**)ppInput;
*ppInput += sizeof(int32_t);
}
*(int32_t *)pOutput = **(int32_t**)ppInput;
然后
*(int32_t *)pOutput
包含垃圾,但如果改变逻辑,
*(int32_t *)pOutput = **ppInput;
然后
*(int32_t *)pOutput
包含正确的值。
请指导我错过线索的地方。
答案 0 :(得分:1)
*(int32_t *)pOutput = **(int32_t**)ppInput;
您正在将指向unsigned char*
的指针转换为指向int32_t*
的指针。那就是你要从int32_t
字节的内存位置读取unsigned char
字节的大小。所以,这肯定会给你垃圾价值sizeof(int32_t) > sizeof(unsigned char)
。
可以将对象指针显式转换为不同类型的对象指针。当“指向T1的指针”类型的prvalue v转换为“指向cv T2的指针”类型时,如果T1和T2都是标准布局类型且T2的对齐要求是,则结果为static_cast(static_cast(v))。没有比T1更严格,或者任何一种类型无效。将“指向T1的指针”类型的prvalue转换为“指向T2的指针”类型(其中T1和T2是对象类型,T2的对齐要求不比T1更严格)并返回其原始类型会产生原始类型指针值。任何其他此类指针转换的结果都是未指定的。