以下のコードはなぜ機能していますか?これはコンパイルエラー(または少なくともランタイムエラー)ですか?浮動小数点型のポインターに文字列を割り当てることができますか?
#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
私は少なくとも、警告オプションを使用する必要があるという主張には同意しません。この小さな例でも、無駄なコードを追加することなく通常は抑止できない誤検出(未使用のパラメータ警告)が生成されています。ここでは 'main'のもう一つの形式を使うことができますが、' argv'だけではなく 'argc'であればどうしますか?私は、コンパイラに無効な、または決定的に悪いスタイルのコードを警告する(そしてエラーを出す)のを大いに支持していますが、あなたが提案したオプションのセットは、gccのために醜い努力をしない限り、 ... –
@R ..私は、それが与える保護と引き換えに "偽"のポジティブに対処するための簡単な修正で暮らすことができます。あなたは代わりに何を提唱していますか? –
私は通常 '-Wall'を使いますが(' -Wextra'ではなく)、 '-Wno- *'でいくつかのオプションを個別にオフにします(例えば未使用の関数パラメータ)。 –