为什么memcpy从int到char不起作用?

时间:2013-07-05 14:18:35

标签: c++

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

当我的十六进制值较小时(例如,0x48656c6c表示"Hell"),打印出char数组会得到正确的输出。但是下面的代码打印"olle"(在little-endian中)但不是"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.

4 个答案:

答案 0 :(得分:5)

平台上可能有int个字节。

如果还有错误,

ideone会显示警告: http://ideone.com/TSmDk5

prog.cpp:在函数'int main()'中: prog.cpp:7:13:警告:隐式常量转换溢出[-Woverflow] prog.cpp:12:5:错误:在此范围内未声明“错误”

答案 1 :(得分:5)

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

因此,在小端机器上,y的内存中表示为6f 6c 6c 65,将其复制到x,从而产生您看到的“olle”。

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

此外,在执行这些操作时始终使用unsigned整数 - 避免UB并在溢出时获得可预测的行为。

答案 2 :(得分:1)

int y = 0x48656c6c6f;

int无法保证存储它,可能是因为您的计算机是32位的。请改用long long

答案 3 :(得分:0)

这是因为你的平台上的int只有4个字节,而当你提供的文字大于那个时,H就会被删除。