2012-04-09 4 views
0

以下のコードはなぜ機能していますか?これはコンパイルエラー(または少なくともランタイムエラー)ですか?浮動小数点型のポインターに文字列を割り当てることができますか?

#include <stdio.h> 

int main(int argc, char** argv){ 
     float *buf = "happy holiday";  // notice the float 
     printf("content of buf = %s\n",buf); //its working 
     return 0; 
} 

私はそれをコンパイルし、単なる警告ました:あなたは常に-Wall -Werror -Wextra(最低でも)でコンパイルする必要があります

~/Desktop/cTest>gcc -o run run.c 
run.c: In function `main': 
run.c:4: warning: initialization from incompatible pointer type 

答えて

3

を。実際には、ご使用のプラットフォーム上のボンネットの下char *float *の間に違いはありませんので

cc1: warnings being treated as errors 
test.c: In function 'main': 
test.c:4: warning: initialization from incompatible pointer type 
test.c:5: warning: format '%s' expects type 'char *', but argument 2 has type 'float *' 
test.c: At top level: 
test.c:3: warning: unused parameter 'argc' 
test.c:3: warning: unused parameter 'argv' 

また「作品」:そして、あなたはこれを取得します。あなたのコードは本当に違いはありません:

#include <stdio.h> 

int main(int argc, char** argv){ 
     float *buf = (float *)"happy holiday"; 
     printf("content of buf = %s\n",(char *)buf); 
     return 0; 
} 

floatcharのアライメント要件は(C99、6.3.2.3 P7を参照)、それは未定義の動作になり、その場合には、異なるない限り、これは、明確に定義された動作です。

+3

私は少なくとも、警告オプションを使用する必要があるという主張には同意しません。この小さな例でも、無駄なコードを追加することなく通常は抑止できない誤検出(未使用のパラメータ警告)が生成されています。ここでは 'main'のもう一つの形式を使うことができますが、' argv'だけではなく 'argc'であればどうしますか?私は、コンパイラに無効な、または決定的に悪いスタイルのコードを警告する(そしてエラーを出す)のを大いに支持していますが、あなたが提案したオプションのセットは、gccのために醜い努力をしない限り、 ... –

+0

@R ..私は、それが与える保護と引き換えに "偽"のポジティブに対処するための簡単な修正で暮らすことができます。あなたは代わりに何を提唱していますか? –

+0

私は通常 '-Wall'を使いますが(' -Wextra'ではなく)、 '-Wno- *'でいくつかのオプションを個別にオフにします(例えば未使用の関数パラメータ)。 –

1

このプログラムは厳密には適合していません。コンパイラは診断結果を出力する必要があり、コンパイルを拒否する権利があります。そうしないでください。

+0

@ NiklasB。代入演算子の制約に違反します。厳密には適合しません。 C99、6.5.16.1p1を参照してください。 – ouah

1

これは残念なことですが、gccとなり、もし誰かが修正されれば、私たちはすべてバグの少ないソフトウェアを扱うことになります。残念ながら、このような多くの問題を修正する意思の欠如があります。バグレポートを送信しても問題はありません。

+1

なぜバグですか?標準では、コンパイラーは診断を発行する必要があります。 –

+0

確かに、私は警告を印刷することによって技術的に規格の要件を満たしていたことを忘れていました。個人的には、コンパイラは、このような制約違反のプログラムを拒否すべきだと考えています。特に、その構造に正当な/正当な使用がない場合です。 –

+0

'gcc'は古いプログラムとの互換性の理由から非常に容認されていますが、私はまた、あまりにも多くの機会にあまりにも容認しています。 – ouah

関連する問題