c++ - 为什么从 int 到 char 的 memcpy 不起作用?

标签 c++

我有十六进制值 0x48656c6c6f,其中每个字节代表字符串 "Hello" 中每个字符的 ASCII 值。我还有一个 char 数组,我想将这些值插入其中。

当我有一个更小的十六进制值时(例如,0x48656c6c,代表“Hell”),打印出char array 给出了正确的输出。但是下面的代码打印 "olle"(在小端)而不是 "olleH"。这是为什么?

#include <iostream>                           
#include <cstring>                             

int main()
{
    char x[6] = {0};
    int y = 0x48656c6c6f;

    std::memcpy(x, &y, sizeof y);

    for (char c : x)
        std::cout << c;
}

Demo is here.

最佳答案

可能 int 在你的机器上是 32 位的,这意味着你的常量的高位字节被切掉了;所以,你的 int y = 0x48656c6c6f; 实际上是 int y = 0x656c6c6f; (顺便说一下,我认为它算作有符号整数溢出,因此是未定义的行为;有在这里定义的行为你应该使用unsigned int)。

因此,在小端机器上,y 在内存中的表示形式是 6f 6c 6c 65,它会被复制到 x,从而得到“olle”你看。

要“解决”这个问题,您应该使用更大的整数,根据您的平台,它可能是long longint64_t 或类似的东西。在这种情况下,请务必使 x 足够大 (char x[sizeof(y)+1]={0}) 以避免缓冲区溢出或更改memcpy 只复制适合 x 的字节。

此外,在执行这些技巧时始终使用unsigned 整数 - 您可以避免 UB 并在溢出的情况下获得可预测的行为。

关于c++ - 为什么从 int 到 char 的 memcpy 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17491043/

相关文章:

c++ - 如何创建多个 2D 幻方阵列?

c++ - 如何在 OpenCV 3.0 中使用 GDAL 打开 ECW 文件

c++ - ar 无法创建存档 : "File format not recognized"

c++ - 打印 std::strings 不产生输出

c++ - 使用二维数组读取 csv 文件

c++ - 如何在结构体中引入dynamic_bitset

c++ - 从 braced-init-list 初始化私有(private)聚合

c++ - 传递对 STL vector 中偏移位置的引用

c++ - Valgrind 显示无效读/写错误,但我不使用 new 或 calloc,仅使用 vector 和固定数组

c++ - 为什么智能指针模板需要在构造函数中禁用异常抛出