2012-01-17 3 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 "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ"

Я думал, что оба будут иметь одинаковый контент, однако это не так как таковые.

Что случилось? Спасибо.

+0

Вы отладки оптимизированного сборки? Это, вероятно, не позаботится о сохранении 'pDst' через окончательный вызов функции, так как это не нужно после присвоения' lDest'. Что произойдет, если вы выйдете из функции и посмотрите результат с точки зрения вызывающего? –

+0

Абсолютно нет, это отладочная сборка (/ MDd), и после ее возвращения значение в моем буфере также равно ÌÌÌÌÌÌÌÌÌ ... – moala

ответ

5

Глядя на documentation для UuidToStringA, он говорит:

RPC-библиотека времени выполнения выделяет память для строки, возвращаемой в параметре StringUuid.

Это означает, что после того, как звонок lDest больше не указывает на pDst.

+1

Вау, спасибо. Я должен RTM. – moala

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

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); 
} 
Смежные вопросы