-1

これは私にはうまくいきません:

char buff[11];
char* msg_ptr;
msg_ptr = buff;
uint8_t id; 
uint32_t msg_length;
char msg[] = "hallo";
id = 77;
msg_length = 5;

memcpy(buff, &id, sizeof(uint8_t));
memcpy(buff+1, &msg_length, sizeof(uint32_t));
strcpy(buff+5, msg);


printf("id :%d\n",*(uint8_t*)msg_ptr);
msg_ptr++;

printf("msg_length: %d\n", *msg_ptr);

msg_ptr++;
printf("msg: %s\n", msg_ptr);

Id と msg_lentgh は konsole に表示されますが、その後、セグメンテーション エラーが発生します。私はCに慣れていないので、できるだけ詳しく教えてください。よろしく

4

1 に答える 1

0
msg_ptr = msg+1

それはあなたの問題だ。次の位置 (*msg_len*) に移動するには、*msg_ptr++* を実行する必要があります。代わりに、ポインタをmsg文字列内の 'a' を指すように変更します。

コードにさらに 2 つのバグがあります。

  • 文字列の末尾の '\0' を考慮しません。1 + 4 + 5 + 1 があり、最後の '\0' で終わります。また、文字列を操作する場合は、文字列ターミネータのコピーを処理するstrncpyを使用します。memcpyは、要求したとおりに正確にコピーします。スタックを破損しています。

  • 最後の行では、文字列を数値として出力する必要があります。%s を使用します。

これは、ウィキペディアが C 文字列とスタック オーバーフローについて述べていることです。

于 2012-05-17T15:36:08.573 に答える