3

プログラムがクラッシュする次のコードの何が問題になっていますか?セグメンテーション違反が発生します。私はgccを使用しています。

uint8_t result = 1      

InsertRow("Name","Details of work",result);     

void InsertRow(char *Name, char *Description,uint8_t Result)   
{  
   char Buffer[500];  

   if(Result==1)   
      sprintf(Buffer,"<tr><td>%s </td> <td> %s </td> <td>  %s </td></tr>",Name,Description,Result);   
} 
4

3 に答える 3

7

%sタイプの引数にフォーマット指定子を使用しています。uint8_tこれはである必要があり%u、一致するように値をキャストする必要がありますunsigned int。これにより、正確なタイプを気にしたり、フォーマッターを調整したりする必要がなくなります(コメント投稿者が示唆しているように)。

また、もちろん、バッファが十分に大きいことを知るのは難しいです。あなたがそれを持っているならば、あなたはsnprinf()これを避けるために使うことができます。

于 2012-05-25T11:28:35.413 に答える
1

ここ

sprintf(Buffer,"<tr><td>%s </td> <td> %s </td> <td>  %s </td></tr>",Name,Description,Result);    

char配列へのポインタとしてResult(タイプは)渡していますuint8_t

これは、整数値が、アクセスできないメモリを指す可能性が最も高いポインタ、つまりセグメントとして解釈されないことを意味します。障害。%s値を整数として出力するには、3番目を適切なフォーマットフラグに置き換える必要があります

:この場合、タイプがと同じサイズであることが保証されていないため%d、直接使用しないでください(ほとんどの場合そうではありません)。の値を最初の()にキャストする場合に使用できますuint8_tint%dResultint(int)Result

于 2012-05-25T11:29:08.780 に答える
0

結果はchar*ではありません。おそらくそのために%dが必要です

于 2012-05-25T11:30:04.490 に答える