【发布时间】:2011-04-27 04:02:21
【问题描述】:
我目前有一个这样的数据包设置:
struct Packet {
unsigned short sequenceNumber;
unsigned short length;
unsigned char control;
unsigned char ack;
unsigned short crc;
unsigned char data[];
Packet copy(const Packet& aPacket) {
sequenceNumber = aPacket.sequenceNumber;
length = aPacket.length;
control= aPacket.control;
ack = aPacket.ack;
crc = aPacket.crc;
memcpy (data, aPacket.data, aPacket.length);
}
};
这个数据包被转换成一个字符串进行加密,然后需要从它的解密字符串形式取回一个数据包。我可以对除unsigned char data[] 之外的所有变量执行此操作。我尝试了以下方法但没有成功:
string data = thePack.substr(pos, thePack.length()-pos);
unsigned char * cData = new unsigned char[data.length()];
strcpy((char *)cData, data.c_str());
memcpy(p.data, cData, data.length());
其中 data 是要复制到 unsigned char [] 中的数据的字符串表示形式,p 是数据包。
这从 valgrind 得到以下信息:
==16851== Invalid write of size 1
==16851== at 0x4A082E7: strcpy (mc_replace_strmem.c:303)
即使它引用 strcpy 作为源代码,它也可以编译并运行良好,只需注释掉 memcpy 行。
我也尝试用strcpy 替换memcpy,结果相同。有任何想法吗?我觉得这可能是因为数据可能尚未初始化并且没有分配任何内存,但我认为memcpy 会解决这个问题。
【问题讨论】:
标签: c++ arrays cstring unsigned-char