現在、次のようにパケットをセットアップしています。
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
ました。