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

C++ 为什么memcpy从int到char不起作用?,c++,C++,我有一个十六进制值0x48656c6c6f,其中每个字节表示字符串“Hello”中每个字符的ASCII值。我还有一个char数组,我想将这些值插入其中 当我有一个更小的十六进制值时(例如,0x48656c6c,它表示“Hell”),打印出char数组给出了正确的输出。但是下面的代码打印的是“olle”(小写),而不是“olleH”。为什么会这样 #include <iostream> #include <cstring>

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

当我有一个更小的十六进制值时(例如,
0x48656c6c
,它表示
“Hell”
),打印出
char
数组给出了正确的输出。但是下面的代码打印的是
“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;
}
#包括
#包括
int main()
{
char x[6]={0};
int y=0x48656C6F;
标准::memcpy(x,&y,y的大小);
用于(字符c:x)

std::cout可能
int
是您平台上的四个字节

如果出现错误,ideone会显示警告:

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

可能
int
在您的平台上是四个字节

int y = 0x48656c6c6f;
如果出现错误,ideone会显示警告:

prog.cpp:在函数“int main()”中: 程序cpp:7:13:警告:隐式常量转换中溢出[-Woverflow] prog.cpp:12:5:错误:未在此作用域中声明“error”

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


int
不能保证存储它,可能是因为您的机器是32位的。请使用
long
代替可能
int
在您的机器上是32位的,这意味着常量的高位字节被截断;因此,您的
int y=0x48656c6f;
实际上是
int y=0x656c6f;
(顺便说一句,我认为它算作有符号整数溢出,因此是未定义的行为;要在这里定义行为,应该使用
无符号int

因此,在一个小的endian机器上,y的内存表示是
6F6C65
,它被复制到
x
,从而产生您看到的“olle”

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


此外,在执行此类操作时,请始终使用无符号整数-您可以避免UB,并在溢出时获得可预测的行为。

可能
int
在您的计算机上是32位的,这意味着常量的高位字节被截断;因此,您的
int y=0x48656c6f;
实际上是
int y=0x656c6f;
(顺便说一下,我认为它算作有符号整数溢出,因此没有定义行为;要在这里定义行为,应该使用
无符号整数

因此,在一个小的endian机器上,y的内存表示是
6F6C65
,它被复制到
x
,从而产生您看到的“olle”

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


此外,在执行此类技巧时,请始终使用无符号整数-您可以避免UB,并在溢出时获得可预测的行为。

这是因为在您的平台上,int只有4个字节,而当您提供大于该值的文本时,H被切掉。

这是因为在您的平台a上int只有4个字节nd当您提供大于该值的文本时,H将被删除。

编译器有警告。请使用它们。@JonathanWakely我没有收到警告。我正在使用联机编译器进行编译。获取真正的编译器:)即使是一个好的在线编译器也会显示警告。ideone需要升级它的游戏。G++说
t.cc:7:13:警告:隐式常量转换溢出[-Woverflow]
我不知道为什么这个问题被否决。虽然对于那些对C/C++编程有着深刻理解的人来说,这不是一个特别具有挑战性的问题,但对于来自不同背景的人来说,这是一个很难回答的问题。@it’s notpete抱歉,我只是在打印“Hello”,而不是“Hello World”(这是一种习惯的力量)编译器有警告。请使用它们。@JonathanWakely我没有收到警告。我是用在线编译器编译的。获得一个真正的编译器:)即使是一个好的在线编译器也会显示警告。ideone需要升级。G++说
t.cc:7:13:警告:隐式常量转换中溢出[-Woverflow]
我不知道为什么这个问题被否决。虽然对于那些对C/C++编程有着深刻理解的人来说,这不是一个特别具有挑战性的问题,但对于来自不同背景的人来说,这是一个很难回答的问题。@it’s notpete抱歉,我只是在打印“Hello”,而不是“Hello World”(这是一种习惯的力量)