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;
}

私はそれをコンパイルし、ちょうど警告を得ました:

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

3 に答える 3

3

-Wall -Werror -Wextra常に(少なくとも) でコンパイルする必要があります。次に、これを取得します。

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'

実際には、プラットフォームの内部でachar *と a の間に違いがないため、「機能します」。float *あなたのコードは、実際には次のものと同じです。

#include <stdio.h>

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

floatこれは、とのアラインメント要件がchar異なる場合を除き、明確に定義された動作です。異なる場合、未定義の動作が発生します (C99、6.3.2.3 p7 を参照)。

于 2012-04-09T21:31:57.667 に答える
1

これは の残念な振る舞いでありgcc、もし誰かがそれを修正できれば、バグの多いソフトウェアを扱うことはずっと少なくなるでしょう。残念ながら、このような多くのことを修正する意志が欠けています。バグ レポートを送信しても害はありません。

于 2012-04-09T21:39:44.727 に答える
1

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

于 2012-04-09T21:32:37.617 に答える