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

Posted

技术标签:

【中文标题】reinterpret_cast on char 和 unsigned char 之间的指针陷阱?【英文标题】:reinterpret_cast on pointers pitfall between char and unsigned char? 【发布时间】:2012-01-17 11:18:14 【问题描述】:

我正在使用以下函数来创建 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“ìììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììììì”

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

发生了什么?谢谢。

【问题讨论】:

您是否在调试优化的构建?这可能不会费心在最终的函数调用中保留pDst,因为在分配给lDest 之后就不需要它了。如果你跳出函数,从调用者的角度来看结果会发生什么? 绝对不是,这是一个调试版本(/MDd),一旦返回,我缓冲区中的值也是ÌÌÌÌÌÌÌÌÌ... 【参考方案1】:

查看documentation 的UuidToStringA,它说:

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

这意味着调用后lDest 不再指向pDst

【讨论】:

【参考方案2】:
void createUUID(char* pDst)

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

看起来您破坏了lDest,而没有更改它最初指向的值。

【讨论】:

我应该已经读取了指针值,至少我会发现它在 UuidToStringA 调用中发生了变化。【参考方案3】:

为了完成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);

【讨论】:

以上是关于reinterpret_cast on char 和 unsigned char 之间的指针陷阱?的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中进行reinterpret_cast以获取像素数组[重复]

使用 constexpr 函数替代 reinterpret_cast

cpp test

cpp test

cpp test

cpp test