code golfのコードを書いているうちに、私はいくつかの奇妙な動作に気がつきました。たとえば:なぜCコンパイラはこのエラーをキャッチしませんか?
int main(void)
{
goto jmp;
char *str = "Hello, World!";
jmp:
puts(str);
}
GCC(およびクランとMSVC)なし警告やエラーで結果をコンパイルし、実行しているが、それはSIGSEGV
をスローします。どのようにコンパイラは、変数宣言の周りにgoto
がジャンプしていることに気づかないのでしょうか?
が、私はこの(?バグ)アウトをテストすることを決めた、と例を書き直し:
再びint main(void)
{
goto jmp;
int x;
jmp:
putchar(x);
}
、コンパイルがエラーを生成しません。さらに、実行時に何もスローされませんが、MSVCではプロセスはゼロ以外の終了コードで終了します。
ここでは何が起こっていますか?これは単にgoto
を使用しないでください。 2番目の例ではエラーは発生しませんが、最初にSIGSEGV
がスローされます。
これは未定義の動作です。変数宣言をスキップして、後でそれを使用しようとしました。これをやろうとしても、どうしたらいいのでしょうか?あなたはどんな結果を期待していますか? – InternetAussie
これはコンパイラの仕事ではありません。 – kaylum
@InternetAussie OPは彼がコードゴルフであると述べている。たぶん[this](https://codegolf.stackexchange.com/q/23250/61563)の挑戦ですか? –