1

どうやら、マシンによっては、このコードが無限ループに陥ったり、終了したり、セグメンテーション違反が発生したりすることがあるようです。行動が一貫していないのはなぜですか?

void loop() {
    int x[512]; 
    int i=0; 
    while (i++ <512) { 
        x[i] = 0; 
    } 
} 
int main () { 
    printf("\nCalling loop -->>\n"); 
    loop(); 
}
4

2 に答える 2

5

post-incrementを行っているためです。511 の場合iは不等式を渡しますが、その後 512 に増加します。割り当てx[512]は、アプリケーションによって所有されているかどうか (未定義)である可能があるメモリへのアクセス違反です。コメントに記載されているように、この間違いによりいわゆる未定義の動作が発生するため、異なるプラットフォームではわずかに異なる動作が発生します。つまり、この (間違った) 操作の結果は、C++ 標準では定義されていません。また、コンパイラやオペレーティング システムが異なれば、基盤となる実装も異なるため、結果も異なります。行動。

于 2013-03-20T00:52:53.970 に答える
1

未定義の動作を (実際に) 呼び出すと、未定義の動作が発生します。つまり、同じマシンでもコンパイラが異なれば結果が異なり、マシンが異なればコンパイラが異なれば結果も異なる可能性があります。なんと、1 台のマシン上の 1 つのコンパイラで月の満ち欠けを見て、それに応じてさまざまなことを行うことができます。未定義の動作はまさに未定義であるため、それらはすべて正しいです。

無限ループが発生した場合、その可能性が&x[512] == &iあり、ゼロを書き込むとx[512](これは未定義の動作です)、ゼロiになり、ループが続行されます。

クラッシュした場合はx[512]、呼び出しスタックの重要な制御情報と一致する可能性があり、リターン アドレスまたはフレーム ポインターを踏みにじることで、システムを完全に台無しにしてしまいます。

しかし、それにもかかわらず、マシンとコンパイラは正常に動作しています。あなたのコードが問題です。ループは次のようになります。

while (i < 512)
    x[i++] = 0;
于 2013-03-20T00:55:00.783 に答える