使用memcpy将多个数据复制到char*中

Copy multiple data with memcpy into char*

本文关键字:char 复制 数据 memcpy 使用      更新时间:2023-10-16

我坚持试图复制一个结构体的大小struct self和一个字到一个字符数组

我知道内存不安全,但这是我知道的唯一方法,如果有人知道更好的方法,请告诉我。

这个字符数组看起来是这样的:04 01 00 00 STRUCTDATA 58 F9 57 00

前4个字节应该是:260最后一个应该是EOP

但它不是。

代码如下:

const char * eop = std::string("EOP").c_str();
char pData[sizeof(int) + sizeof(_welcomeMessage) + sizeof(eop)];
int packetSize = sizeof(_welcomeMessage);
memcpy(pData, &packetSize, sizeof(packetSize));
memcpy(pData + sizeof(int), &_welcomeMessage, sizeof(_welcomeMessage));
memcpy(pData + sizeof(int) + sizeof(_welcomeMessage), &eop, sizeof(eop));

我希望有人能帮助我。

前四个字节确实等于260。:)

04 01 00 00在十六进制中等于4 + 256,等于260。因此,04 01 00 00是数字260的正确内部表示。

至于结果的第三部分,那么你正在复制指针eop的地址,而似乎你需要复制字符串字面量"EOP"。

我看不出这个定义有什么意义

const char * eop = std::string("EOP").c_str();

此外,使用变量eop会导致未定义的行为,因为std::string类型的临时对象将在语句结束时被删除。

为什么不直接写成

const char * eop = "EOP";

const char eop[] = "EOP";

在这两种情况下,您必须在调用memcpy时使用标识符eop,而不是表达式&eop,指定复制数据的正确大小。

至于结构体,那么它是否被正确复制就不能说什么了,因为你没有显示结构体的定义,也没有显示复制的结果。

至少,在这句话之后:

const char * eop = std::string("EOP").c_str();

eop指向不再有效的内存,因为std::string("EOP")的析构函数已经运行。