2012-01-17 58 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); 
} 
相關問題