0

Cのmemcpyで問題が発生しました。コードは次のとおりです。

typedef struct {
CPY_IM009_DEF
}message;

message msg;

CPY_IM009_DEF は、他のファイルの構造体です。それから私はこれを試します

char wx_msg_buf[8192];
memset(wx_msg_buf, 32, sizeof (wx_msg_buf));
memcpy(wx_msg_buf, &msg, sizeof (msg));

サイズを確認すると:

sizeof (メッセージ) = 2140

sizeof (wx_msg_buf) = 8192

しかし、wx_msg_buf を確認すると、memcpy は msg の一部のみを wx_msg_buf (2140 から 200) にコピーします。私が知りたいのは、なぜこれが起こるのか?もっとコードが必要な場合は教えてください

助けてくれてありがとう。

4

5 に答える 5

3

どのようにチェックしていますか?文字列を出力するだけですか、それともデバッガで見るだけですか? メッセージに「\0」文字が含まれている場合。最初の印刷で停止します。

全体を見るには、ループして各文字を出力するだけです。このようなもの:

int i;
for(i = 0; i < sizeof(wx_msg_buf); ++i) {
   printf("%02x ", wx_msg_buf[i]);
}
于 2010-07-01T05:33:36.680 に答える
1

コードは私にはうまく見えます。問題は、あなたの見方にあるかもしれません。基礎となる構造のレイアウトと、2000 バイトについての観察を得るために使用するツールは何ですか?

于 2010-07-01T05:34:52.667 に答える
0

さて、私は変更します:

char wx_msg_buf[8192];

の中へ

char wx_msg_buf[2141];

そして今、コードは機能しますが、以前のコードが機能しない理由をまだ理解できません

于 2010-07-01T10:30:25.213 に答える
0

一度試してみてください。「memcpy」の代わりに「memmove」.. memcpy() の方が高速ですが、移動元と移動先が重なっているメモリ ブロックを移動する場合は安全ではありません。そのような場合、 memmove() を使用してメモリを移動できます。

したがって、「memmove」を使用することをお勧めします..それで問題が解決すると思います

于 2010-07-01T07:29:31.440 に答える
0

デバッガーでソース データと結果データを確認します。

memcpy() に欠陥があるとはほとんど考えられません。これは非常に広く使用されています。

于 2010-07-01T05:37:35.920 に答える