为什么从int到char的memcpy不起作用
Why is memcpy from int to char not working?
我有十六进制值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
可能是32位,这意味着您的常量的高位字节被截断;所以,您的int y = 0x48656c6c6f;
实际上是int y = 0x656c6c6f;
(顺便说一句,我认为它算作有符号整数溢出,因此是未定义的行为;要在这里定义行为,应该使用unsigned int
)。
因此,在一个小endian机器上,y在内存中的表示是6f 6c 6c 65
,它被复制到x
,从而产生您看到的"olle"。
要"解决"这个问题,您应该使用一个更大的整数,根据您的平台,它可能是long long
、int64_t
或类似的东西。在这种情况下,请确保使x
足够大(char x[sizeof(y)+1]={0}
)以避免缓冲区溢出,或者将memcpy
更改为仅复制适合x
的字节。
此外,在执行这些技巧时,请始终使用unsigned
整数——您可以避免UB,并在溢出的情况下获得可预测的行为。
int
在您的平台上可能是四个字节。
如果同时存在错误,ideone确实会显示警告:http://ideone.com/TSmDk5
prog.cpp:在函数"int main()"中:prog.cpp:7:13:警告:隐式常量转换中溢出[-Woverflow]prog.cpp:12:5:错误:未在此作用域中声明"error"
int y = 0x48656c6c6f;
int
不能保证存储它,可能是因为您的机器是32位的。使用long long
代替
这是因为在您的平台上,int只有4个字节,而当您提供大于该值的文字时,H将被截断。
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 从向量到空指针的 memcpy(反之亦然)不起作用
- C++/Arduino:strcpy()、strncpy() 和 memcpy() 在无符号字符上不起作用
- 为什么在调用 memcpy 到 bool 值后 memcpy 到 int 不起作用
- 将std ::复制转换为std :: memcpy不起作用
- 为什么将字符数组复制到结构中时 memcpy 不起作用?
- 为什么从int到char的memcpy不起作用