wcslen() 在使用编译指示包时返回不正确的结果
wcslen() returns incorrect result when pragma pack used
我发现wcslen()在gcc上返回不正确的结果(在msvc上返回正确的结果),当源是数组,打包结构的成员时wchar_t。我知道在 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++ 中返回锻炼时
- 在类中返回结构时出现问题
- 接受函数在发送数据包时等待
- 尝试使用 RTool 在 R4.0 上安装软件包时出现编译错误
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 当if语句告诉程序返回0时,我的程序不会退出
- 使用jsoncpp-NuGet包时获取未解析的外部符号
- 当模板类使用参数包时,如何传递其他模板参数
- wcslen() 在使用编译指示包时返回不正确的结果
- 隐式转换函数的返回对象时是否会影响性能?
- 从两个 lambda 的函数返回 lambda 时的链接器错误
- 返回对象时从'const DList<int>* const'到 'DList<int>*' [-fallowive] 的转换无效
- 返回 *&object 时是否允许复制/移动省略?
- 在 Cloud9 上安装 AWS C++ 开发工具包时出现问题
- 在 R 中安装"RcppArmadillo"包时出错
- vcpkg 在安装软件包时找不到 cmake.cmd
- 当一种方法有三种返回可能性时该怎么办?
- 当我返回内部时,循环在C 中不起作用
- 定位包时未设置QT的Cmake Dragndrop框架
- 返回 int 时的分段错误