2012-02-16 4 views
3

「形式の文字列リテラルではありませんし、フォーマット引数を持ちません」私はコンパイルエラー持た

libvncserver/main.c:245: error: format not a string literal and no format arguments 

そしてライン245は、次のとおりです。bufが

fprintf(stderr,buf); 

ある「CHAR buf [256]; "

私は245行目で何が間違っているのか分かりません。どうすれば修正できますか? その行をコメントアウトすると、プログラムがコンパイルされます。

答えて

7

間違って何をしてあなただけのchar *を提供している間に任意のprintf機能がconst char *を期待していることです。バッファには任意のものを含めることができるので、コンパイラは正しいフォーマット文字列を含んでいるとは確信していません。ちょうど

fprintf(stderr,"%s",buf); 

あなたがあなたが奇妙な何かを渡すつもりはないことを確かめるでしょう。

+4

'const char *'パラメータに 'char *'引数を指定するのは間違っていません。実際、それはかなり一般的で正常です。 'const char *'パラメータは、関数が引数文字列を変更しないことを約束します。呼び出し側が一定の引数を要求することはありません。 (回答の残りの部分は多少正確ですが、私はicktoofayの答えをより正確に考えています) – ibid

+0

HarvardアーキテクチャのCPUで作業する場合、コンパイラは通常、リテラル文字列を命令メモリに格納します。書き込み可能なバッファはデータメモリに配置されます。この場合、パラメータをconst char *として宣言すると、コンパイラは命令メモリ(すなわちFLASH)からデータを読み込む命令を生成します。したがって、一般的には、関数がリテラルを期待する場合、書き込み可能なバッファを渡すことはできません。残念ながら、 'const char *'という言葉は、 '私はあなたのバッファを変更しません'と言っています...そして、それはここでの混乱の原因です。 – fabrizi0

3

%sのような書式指定子が含まれている場合、プログラムは提供していない引数を読み込もうとします。プログラムがクラッシュしたり、スタックが壊れたりする可能性があります。 GCCはそれについてあなたに警告しています。このように変更します。

fprintf(stderr, "%s", buf); 
関連する問題