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

发布于 2024-12-27 13:20:34 字数 482 浏览 1 评论 0原文

我使用以下函数来创建 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 " ”

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

发生了什么?谢谢。

I'm using the following function in order to create an UUID and write it in a human-readable form into a pre-allocated buffer. Something goes wrong.

void createUUID(char* pDst)
{
    UUID    lUUIDObj;
    UuidCreate(&lUUIDObj);
    unsigned char*  lDest = reinterpret_cast<unsigned char*>(pDst);
    UuidToStringA(&lUUIDObj, &lDest)
}

At the end of the method, the debugger says:

  • lDest = 0x01fe4fd8 "df4a5ed8-c0d2-495a-84d7-ce0e07cf2113"
  • pDst = 0x0012ec7c "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ"

I thought that both would have the same content, however it is not the case.

What happened? Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

只是一片海 2025-01-03 13:20:34

查看文档 UuidToStringA,它说:

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

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

Looking at the documentation for UuidToStringA, it says:

The RPC run-time library allocates memory for the string returned in the StringUuid parameter.

This means that after the call lDest does no longer point to pDst.

琉璃繁缕 2025-01-03 13:20:34
void createUUID(char* pDst)
{
    UUID    lUUIDObj;
    UuidCreate(&lUUIDObj);
    unsigned char*  lDest = reinterpret_cast<unsigned char*>(pDst);
    //UuidToStringA(&lUUIDObj, &lDest);
    UuidToStringA(&lUUIDObj, lDest);
}

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

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

Looks like you clobbered the value of lDest without changing the values it originally pointed to.

简单 2025-01-03 13:20:34

为了完成Joachim Pileborg的回答,这里是更正后的函数:

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

In order to complete Joachim Pileborg's answer, here is the corrected function:

void createUUID(char* pDst)
{
    UUID    lUUIDObj;
    UuidCreate(&lUUIDObj);
    unsigned char*  lTmpStr;
    UuidToStringA(&lUUIDObj, &lTmpStr);
    sprintf(pDst, reinterpret_cast<char*>(lTmpStr));
    RpcStringFreeA(&lTmpStr);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文