У меня в настоящее время есть пакет, настроенный следующим образом:
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
.
Я также попытался заменитьmemcpy
с strcpy
с тем же результатом.Есть идеи?Я чувствую, что это может быть связано с тем фактом, что данные, возможно, не были инициализированы и для них не было выделено никакой памяти, но я думал, что memcpy
позаботится об этом.