0

重複の可能性:
TurboCアレイの質問

#include <stdio.h>

#define LIM 40

int main()
{
       int day=0;
       float temp[LIM];
       do
       {
               printf("Enter temperature for day %d.", day);
               scanf("%f", &temp[day]);
       }
       while(temp[day++] && day<LIM );
}

最終行について。なぜ満足しないのwhile(temp[day++] > 0)ですか?LIMを40の値に設定したので?なぜ、次のような条件を追加する必要があるのday<LIMですか?

4

3 に答える 3

3

なぜなら、41の数字を入力すると、配列の外側の場所に書き込み、恐ろしい未定義動作を呼び出すからです。(41番目の要素)に書き込もうとするとtemp[40]、メモリを壊してはいけない可能性があります。配列の終わりを少し超えても機能する可能性がありますが、それは未定義の動作の性質です。それはまだ良い考えではありません。

実際に入力した値に関係なく、40の温度を入力すると、day < LIMビットによってループが強制的に終了します。

于 2011-05-21T08:06:03.237 に答える
2

アレイのオーバーフローを回避するため。temp配列にはセルがあり、未定義のLIM動作が発生するため、それを超えてメモリにアクセスしようとしないことを確認する必要があります。

40を超える要素を取得する場合は、それらにさらに多くのメモリを割り当てる必要があります。これはLIM、などのより大きな値に定義することで実行できます#define LIM 48

于 2011-05-21T08:06:22.910 に答える
1

Cは魔法を使わないからです。割り当てられたメモリの外に出たかどうかはチェックされません。アクセスが有効かどうかわからないので、とにかく試してみます。

于 2011-05-21T08:06:05.327 に答える