C コンパイルでの未定義の動作
指定されたコードでは、予想される動作は配列 mc をインデックス 0 から 3 まで反復処理することです。値を出力すると、一連の数値「0、1、2、3」が得られます。ただし、観察された動作は、終わりのない一連の「0、1、2、3、...」を出力する無限ループです。
問題の根本は、代入ステートメント delta = mc[ディ]。この操作は、配列 mc の有効なインデックスを超えて、具体的にはインデックス 4 (範囲外) にアクセスしようとします。 C では、このようなアクセスにより未定義の動作が呼び出され、コンパイラが予測できない方法で動作する可能性があります。
この場合、最適化が有効になっている (例: -O2 フラグを使用する) コンパイラは、未定義の動作が発生しないと想定します。具体的には、 di
この仮定により、積極的なループ最適化が行われます。最適化されたコードでは、 di
-fno-aggressive-loop-optimizations フラグを使用して積極的なループ最適化をオフにすると、コンパイラは期待どおりに動作します。未定義の動作の可能性を認識し、問題のある最適化を防ぎます。
C での未定義の動作は、予測不可能で潜在的に有害な結果をもたらす可能性があることに注意することが重要です。未定義の動作に依存することを避け、言語仕様に準拠したコードを作成することをお勧めします。
以上が境界外の配列にアクセスすると C ループが永遠に実行されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。