2012-05-09 11 views
0

memcpy measure_msg(struct test)をバッファに書き込もうとしました。しかし、以下のコードはデータをコピーしていないようです。戻り値memcpy構造が失敗しました

**** 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; 
} 
+0

これは機能していないようですか?何を印刷すると思いますか? – moooeeeep

答えて

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)として格納され、それは(あなたの構造の最初のバイトの内容になるだろう等々)。

これは本当にあなたのコードを実行したいのであれば、正確です(しかし、ポインタであまりにも多くの演奏をしています、それは単なるテストですか?)しかし、本当に本当に奇妙です。あなたが必要とするものをしなさい。

0

私のシステム(GCC/MinGW、Windows)でmemcpy()コールが正常に機能しています。バフにコピーされる「文字」の一部が印刷できないため、適切な出力が得られません。

ではなく

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 

として保存されますが、文字の配列に構造体をコピーして、とにかく何をすべきかをしようとしていますか?

+0

出力はシステムによって異なりますのでご注意ください。 Intelアーキテクチャを使用するシステムでは、数字を格納するために「リトルエンディアン」の規約が採用されています。つまり、最下位バイト(0x00000457の0x57など)が最初に格納され、最上位バイトが最後に格納されます。また、GCCのintデータ型のサイズは4であり、これは他のコンパイラでは当てはまりません。 –

0

memcpymeasure_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]) 
関連する問題