gpt4 book ai didi

c++ - 使用 pragma pack 时 wcslen() 返回不正确的结果

转载 作者:行者123 更新时间:2023-11-30 01:33:25 25 4
gpt4 key购买 nike

我发现当源是 wchar_t 数组(压缩结构的成员)时,wcslen() 在 gcc 上返回不正确的结果(在 msvc 上是正确的)。我知道在 linux 上 sizeof(wchar_t) == 4 和在 windows 上它的 2 但仍然无法理解打包如何影响 wcslen() 函数。如果我将 wchar_t/wcslen 更改为 char/strlen,它将按预期工作。

#include <cstdint>
#include <cwchar>
#include <cstring>

#pragma pack(push, 1)

struct A
{
uint8_t c;
};

struct B
{
A a;
wchar_t buf[9];
};

#pragma pack(pop)


int main()
{
const wchar_t* s = L"05.00.06";
B b{};
memcpy(b.buf, s, wcslen(s) * sizeof(wchar_t));

return wcslen(b.buf);
}

为什么这段用 gcc 编译的代码返回 7?它应该返回 8(与 msvc 一样)。顺便说一句,复制的字节是正确的(b.buf[7] == '6')。

最佳答案

此代码的行为是未定义且不可预测的。您向 wcslen 函数传递了一个无效指针,因为它不一定满足其类型的对齐要求。

可能在您的平台上,wchar_t 的对齐要求是 2。因此您传递给 wcslen 的指针无效。您在 strlen 中看不到类似的行为,因为在这种情况下对齐要求为 1,这意味着根本没有要求。

除非您知道您已符合平台的对齐要求,否则不要对压缩结构进行操作。否则,结果完全不可预测。在许多平台上,您的代码会崩溃。

关于c++ - 使用 pragma pack 时 wcslen() 返回不正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58510203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com