reinterpret_cast на ловушку указателей между char и unsigned char? - PullRequest
0 голосов
/ 17 января 2012

Я использую следующую функцию, чтобы создать 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 ]

5 голосов
/ 17 января 2012

Глядя на документацию для UuidToStringA, он говорит:

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

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

1 голос
/ 17 января 2012
void createUUID(char* pDst)
{
    UUID    lUUIDObj;
    UuidCreate(&lUUIDObj);
    unsigned char*  lDest = reinterpret_cast<unsigned char*>(pDst);
    //UuidToStringA(&lUUIDObj, &lDest);
    UuidToStringA(&lUUIDObj, lDest);
}

Похоже, что вы пометили значение из lDest без изменения значений, которые изначально указывали на .

0 голосов
/ 17 января 2012

Чтобы завершить ответ Иоахима Пилеборга , вот исправленная функция:

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