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以获取像素数组[重复]