0

memcpy measure_msg (構造体テスト) をバッファーにしようとしました。ただし、以下のコードはデータをコピーしていないようです。戻り値

**** ptr:0xb781c238
**** ptr:0xb781c23c
**** ptr:0xb781c244
buff[0]=5 - buff[1]=0 - buff[2]=0 - buff[3]=0 - buff[4]=W - buff[5]= - buff[6]= - buff[7]= - buff[8]= - buff[9]= - buff[10]= - buff[11]= - 

このコードのチャンクで何が問題になったのでしょうか?

struct test{
  int mode;
  int id;
};

int func()
{   
int i, size;
struct test measure_msg;
char buff[20];
char* ptr;    

memset(&measure_msg, 0x00, sizeof(struct test));

ptr = buff;
fprintf(stderr, "**** ptr:%p\n", ptr);
sprintf(ptr, "%02d%02d", 50, 0);
ptr += 4;
size = 4;
size += sizeof(struct test);

fprintf(stderr, "**** ptr:%p\n", ptr);

measure_msg.id = 9999;
measure_msg.mode = 1111;

memcpy(ptr, &measure_msg, sizeof(struct test));
ptr += sizeof(struct test);

fprintf(stderr, "**** ptr:%p\n", ptr);

for (i=0; i<size; i++){
  fprintf(stderr, "buff[%d]=%c - ", i, buff[i]);
}

return 0;
}
4

3 に答える 3

1

あなたは奇妙なことをしていますが、これを見てください:

sprintf(ptr, "%02d%02d", 50, 0);

バッファに文字列を書き込みます。現在bufは「5000」が含まれています。値 50 と 0 は含まれませんが、それらの文字列表現が含まれることに注意してください。

バッファを構造体にコピーすると、そのフィールドがこれらの 4 バイトに設定されますが、文字列を出力するときに表示されるものではなく、ASCII コードです。この行で次の点に注意してください。

fprintf(stderr, "buff[%d]=%c - ", i, buff[i]);

バッファの内容を文字として出力し、「5」は 0x35 (10 進数で 53) として保存され、構造体の最初のバイトの内容になります (など)。

これが本当にあなたがやりたいことなら、あなたのコードは正確です (しかし、あなたはポインタで遊んでいます。それは単なるテストですか?) しかし、それは本当に奇妙です。そうでなければ、必要なことをするために間違った方向に歩いています.

于 2012-05-09T07:31:58.010 に答える
0

memcpy () 呼び出しは、私のシステム (GCC/MinGW、Windows) で問題なく動作しています。バフにコピーされる「文字」の一部が印刷できないため、適切な出力が得られません。

試す

fprintf (stderr, "buff[%d]=%x - ", i, buff[i]);

代わりは。

データは次のように保存されます。

buff [0]  = 0x35  /* ASCII for '5' */
buff [1]  = 0x30  /* ASCII for '0' */
buff [2]  = 0x30
buff [3]  = 0x30
buff [4]  = 0x57  /* as 1111 is 0x00000457 in hex */
buff [5]  = 0x04  /* stored in little endian convention */
buff [6]  = 0x00  /* and here size of int = 4 */
buff [7]  = 0x00
buff [8]  = 0x0F  /* as 9999 is 0x0000270F in hex  */
buff [9]  = 0x27
buff [10] = 0x00
buff [11] = 0x00 

しかし、構造体を文字の配列にコピーすることによって、とにかく何をしようとしていますか?

于 2012-05-09T07:37:21.807 に答える
0

あなたがmemcpyあなたmeasure_msgにいるとき、buffあなたはint型の値をコピーしています。その後、char型の値を出力しています。int 型の値は、印刷表現を持たない 4 バイトで構成されます。つまり、33752069 の int 値、16 進形式の 0x02030405 は、4 バイトを持ち、char のように印刷されると、0x02、0x03、0x04、および 0x05 の char 値が得られます。

印刷マスを int 値を使用するように変更し、それぞれbuff[i]を int にキャストすると、値が印刷されます。

fprintf(stderr, "buff[%d]=%d - ", i, (int)buff[i])
于 2012-05-09T07:40:35.160 に答える