問題をブレインストーミングしようとしたときに、非常に奇妙な動作が見つかりました。
コードの目的:配列内の最大数を見つけるための単純なコード。最初のインデックスを変数に格納し、リスト内の他のすべてのインデックスと比較するだけです。別の数値が大きい場合、その数値が変数に格納されている数値に置き換わり、リストの最後までプロセスが繰り返されます。
#include <stdio.h>
const int SIZE = 8;
int main(void)
{
int arr[] = {7, 3, 9, 14, 1, 27, 14, 2};
int largest;
largest = arr[0];
for (int i = 1; i <= SIZE; i++)
{
if (largest < arr[i])
{
largest = arr[i];
}
}
printf("The largest number in the array is %i\n", largest);
}
奇妙な振る舞い:これは時々機能します。また、あるべきではない記憶の領域にぶつかったような印象を与える大きな数字を受け取ることもあります。これが毎回発生するかどうかは理解できましたが、2回目または3回目ごとにしか発生しないため、コードをコンパイルすると戸惑います。コードは変更されませんが、出力は変更されます
コンソールログ:
~/pset3/plurality/ $ ./test
The largest number in the array is 1366797536
~/pset3/plurality/ $ ./test
The largest number in the array is 27
~/pset3/plurality/ $ ./test
The largest number in the array is 27
~/pset3/plurality/ $ ./test
The largest number in the array is 1773422672
~/pset3/plurality/ $
私の考え:ループがどういうわけかヒットし、配列の終わりを超えて、それを最大数と見なします。繰り返しますが、これの奇妙な点は、これが50%の時間しか発生しないことです
どんなアイデアでも大歓迎です。
ループの実行回数が多すぎます。ループ終了条件i <= SIZE
によりarr[SIZE]
、arr
配列の外側にあるループ本体にアクセスします。C配列のインデックスは0から始まることに注意してください。
配列はスタックフレームに格納されているため、コードは配列を超えた最初のアドレスにあるスタックからガベージ値をフェッチします。このガベージ値は何でもかまいません。したがって、大きな正の値になる可能性があり、結果として表示されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加