我发现当源是 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')。