2012-01-17 52 views
-1

我正在使用以下函数来创建一个UUID,并将其以可读的形式写入预先分配的缓冲区中。出了点问题。指针上的reinterpret_cast char和unsigned char之间的陷阱?

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 “ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ”

我认为两者都会有相同的内容,但它不是ca SE。

发生了什么事?谢谢。

+0

你在调试优化的建立?这可能不会在最后的函数调用中保留'pDst',因为在分配给'lDest'后不需要。如果你退出该功能会发生什么情况,并从调用者的角度看结果? – 2012-01-17 11:25:20

+0

绝对不是,这是一个调试版本(/ MDd),一旦返回,我的缓冲区中的值也是太对于太太太太太... – moala 2012-01-17 11:28:45

回答

5

纵观documentationUuidToStringA,它说:

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

这意味着拨打lDest后不再指向pDst

+1

哇,谢谢。我应该RTM。 – moala 2012-01-17 11:41:27

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

看起来你打一顿的lDest而不改变它原来指出值。

+0

我应该读取指针值,至少我会发现它在UuidToStringA调用中发生了变化。 – moala 2012-01-17 11:40:39

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); 
} 
相关问题