reinterpret_cast指向char和unsigned char之间的指针陷阱?

时间:2012-01-17 11:18:14

标签: c++ char uuid reinterpret-cast unsigned-char

我正在使用以下函数来创建UUID并将其以人类可读的形式写入预先分配的缓冲区。出了点问题。

void createUUID(char* pDst)
{
    UUID    lUUIDObj;
    UuidCreate(&lUUIDObj);
    unsigned char*  lDest = reinterpret_cast<unsigned char*>(pDst);
    UuidToStringA(&lUUIDObj, &lDest)
}

在方法结束时,调试器说:

  • lDest = 0x01fe4fd8“df4a5ed8-c0d2-495a-84d7-ce0e07cf2113”
  • pDst = 0x0012ec7c“在”

我认为两者都有相同的内容,但事实并非如此。

发生什么事了?谢谢。

3 个答案:

答案 0 :(得分:5)

查看UuidToStringA的{​​{3}},它说:

  

RPC运行时库为StringUuid参数中返回的字符串分配内存。

这意味着在通话lDest不再指向pDst

之后

答案 1 :(得分:1)

void createUUID(char* pDst)
{
    UUID    lUUIDObj;
    UuidCreate(&lUUIDObj);
    unsigned char*  lDest = reinterpret_cast<unsigned char*>(pDst);
    //UuidToStringA(&lUUIDObj, &lDest);
    UuidToStringA(&lUUIDObj, lDest);
}

看起来你破坏了lDest而没有改变它最初指向的值。

答案 2 :(得分:0)

为了完成Joachim Pileborg's answer,以下是更正的功能:

void createUUID(char* pDst)
{
    UUID    lUUIDObj;
    UuidCreate(&lUUIDObj);
    unsigned char*  lTmpStr;
    UuidToStringA(&lUUIDObj, &lTmpStr);
    sprintf(pDst, reinterpret_cast<char*>(lTmpStr));
    RpcStringFreeA(&lTmpStr);
}