0

例えば:

array[2]={1,2};
myInt=5;

if (array[myInt-6]==2)
   cout << true << endl;
else
   cout << false << endl;

ifステートメントの配列で参照されている値が明らかに範囲外です。これをコンパイルして実行すると、条件が真ではないので意味のあるfalseが出力されますが、なぜエラーが出力されないのか疑問に思います。

4

3 に答える 3

10

未定義の動作は未定義であるため。動作しているように見えることを含め、何でも起こり得ます。

コンパイラーやランタイムの診断は必要ありません。境界チェックは自分で行う必要があります。

于 2012-07-24T14:03:52.317 に答える
0

C ++はメモリセーフな言語ではないため、コンパイラやランタイムではなく、このような問題を回避するのはあなたの仕事です。

次の問題。

于 2012-07-24T15:23:06.263 に答える
-4

呼び出しarray[-1]はエラーではありません。*(array - 1)つまり、配列の1int前のアドレスの値の省略形です。OSがこのアドレスをプログラムに割り当てたとすると、intにキャストされたデータのランダムなビットを取得するだけです。

その場所に保存されているデータは毎回同じである可能性が高いため、同じ動作が得られます。それはあまり意味がありません。このようなことを強制してエラーを発生させたい場合は、標準テンプレートライブラリのコンテナの1つ(ベクトルなど)を使用するのがおそらく最も簡単です。

于 2012-07-24T14:23:49.250 に答える