2

2つのint、2つのshort、1つのcharを次々にコピーしたいと思います。

これは私がしたことです:

int32_t a=1;
int32_t b=2;
int16_t c=3;
int16_t d=4;
int8_t e=5;
char*buf=new char[104];
memcpy(buf, &a, 32);
memcpy(buf + 32, &b, 32);
memcpy(buf + 64, &c, 16);
memcpy(buf + 80, &d, 16);
memcpy(buf + 96, &e, 8);

これは正しいです ?私のデバッガーは、3行目が2行目に影響を与えると言っていますが、デバッガーを誤用しているだけかもしれません(具体的には、*((int32_t *)(buf + 32))の値が2番目と3番目のmemcpyの間で変更されたと言っています) 。

ありがとう。

4

2 に答える 2

8

あなたはビットとバイトを混同し、メモリの大部分を上書きして上書きしています!

int32_t x; /* 4 bytes, 32 bits */
int16_t y; /* 2 bytes, 16 bits */

memcpy(buf            , &x, sizeof(x)); /* copy 4 BYTES, or sizeof(x) */
memcpy(buf + sizeof(x), &y, sizeof(y)); /* copy 2 bytes */

したがって、バッファは必要な量の約8倍になり、毎回必要な量の4倍のデータをコピーします。

于 2012-07-09T13:35:38.067 に答える
2

memcpyサイズをビットではなくバイトで測定します。そのはず:

memcpy(buf, &a, 4);
memcpy(buf + 4, &b, 4);
memcpy(buf + 8, &c, 2);
memcpy(buf + 10, &d, 2);
memcpy(buf + 12, &e, 1);
于 2012-07-09T13:35:55.863 に答える