先日私がインタビューで出会った問題は、誰かがこの「シンプルな」コードの背後にある「真実」を教えてくれるだろうか?このコードはなぜoutOfBoundですか?
#include<stdio.h>
int main()
{
int a[]={1,2,3};
for(int i=0; i<=3; i++){
a[i]=0;
printf("%d\n", i);
}
return 0;
}
先日私がインタビューで出会った問題は、誰かがこの「シンプルな」コードの背後にある「真実」を教えてくれるだろうか?このコードはなぜoutOfBoundですか?
#include<stdio.h>
int main()
{
int a[]={1,2,3};
for(int i=0; i<=3; i++){
a[i]=0;
printf("%d\n", i);
}
return 0;
}
ループ変数i
は、値0をとる1、2、残念ながら3、3が範囲外のインデックスのみ長さ3(法的インデックス0を有するアレイa
用であり、1 2)。範囲外の配列アクセスを回避するために、ループ制御は
for(int i=0; i<3; i++){
注<
代わりに<=
の使用であるべきです。インタビューの質問として、目標はoff-by-one errorの非常に一般的な種類に気づいたかどうかをテストすることでした。
男性はまた、このコードの最悪の結果が何であるか尋ねました。記述方法はわかりません。何かもっと説明しますか?ありがとう。 – true2009fans
OH .....「off-by-oneエラー」リンクをありがとう、私は学んでいます、ありがとうございます。 – true2009fans
@ true2009fans - 'a 'の直前のメモリ位置に0を書き込むことの効果は全く予測できません。これは、とりわけ、コンパイラとハードウェアアーキテクチャに依存する、 'a 'の直前のメモリに何が起こるかに完全に依存します。何も効果がない、クラッシュする、制御できないコードに制御を渡すことができます。実際、このようなバッファオーバーフローは、ハッカーにとっての主要な攻撃ベクトルです。 –
すべては、それが結合されたインデックスエラーのうちアレイを引き起こしているよう<により置換され= <なら右になり、アレイの内容の値が毎回0されるであろう値印刷され
問題が何であるかは不明ですが、詳細を追加できますか? – SurvivalMachine