C / C ++双指针解引用问题

时间:2014-12-22 06:49:30

标签: c++ c pointers

我在解除指向指针的值时面临一个问题。

考虑以下功能可以正常工作:

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 

包含正确的值。

请指导我错过线索的地方。

1 个答案:

答案 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更严格)并返回其原始类型会产生原始类型指针值。任何其他此类指针转换的结果都是未指定的。