-1

理解できない動作をする C プログラムを書きました。Cについてもう少し学ぶことを期待してこれを投稿しています。コードは、まったく要求されていないときに、fscanfを使用して変数名を他の変数に書き込んでいるようです...

#include <stdio.h>
#include <stdlib.h>

int main() {
float BCL[6];
float varsRA[23],varsLA[23],varsBB[23],varsPV[23];  
FILE *inputfil;
int i;

inputfil = fopen ("file.txt", "rt");        
for(i=0;i<24;i++) {
    fscanf(inputfil,"%f %f %f %f\n", &(varsRA[i]), &(varsLA[i]), &(varsBB[i]), &(varsPV[i]));
}

i=23;
printf("vars%d:%f %f %f %f\n",i,varsRA[i], varsLA[i], varsBB[i], varsPV[i]);

i=0;
while(!feof(inputfil)) {
    fscanf(inputfil,"%f ",&(BCL[i]));
    i++;
}

i=23;
printf("vars%d:%f %f %f %f\n",i,varsRA[i], varsLA[i], varsBB[i], varsPV[i]);

fclose(inputfil);
return 0;
}

結果は次のとおりです。

vars23:-66.336823 -68.164223 -57.850136 -60.762585
vars23:-66.336823 -68.164223 -57.850136 177.000000

ファイルの残りの部分を読み取ると、varsPV の最後の値が BCL の最初の値である 177 に変更されたのはなぜですか?

助けてくれてどうもありがとう、マルタ

4

3 に答える 3

3

配列の境界を超えてアクセスしているため、プログラムの動作は未定義です。

for(i=0;i<24;i++) {
    fscanf(inputfil,"%f %f %f %f\n", &(varsRA[i]), &(varsLA[i]), &(varsBB[i]), &(varsPV[i]));
}

配列インデックスは から0まで実行されますN - 1。ここNで、 は配列内の要素の数です。配列は 23 要素で定義されています。つまり、有効なインデックスは022です。ループ終了条件を変更するi < 23か、コンパイル時定数を使用して配列サイズと終了条件を定義し、その情報が重複しないようにします。

プログラムには他にも境界外アクセスがあり、このループは境界外に出ないように保護する必要があります。

i=0;
while(!feof(inputfil)) {              /* i < 6 required */
    fscanf(inputfil,"%f ",&(BCL[i]));
    i++;
}

fscanf()割り当てが実際に行われたことを確認するために、常に の戻り値をチェックしてください。fscanf()行われた割り当ての数を返します。

for (i = 0; i < 6 && 1 == fscanf(input, "%f", &BCL[i]); i++);
于 2013-01-30T16:34:02.937 に答える
1

配列が十分に大きく定義されていません。配列には、 からvarsRA[23]番号が付けられた 23 個の要素のみが含まれます。から番号が付けられた24個の要素を読み込んでいます。配列定義を次のように変更すると、準備完了です。022023

float varsRA[24],varsLA[24],varsBB[24],varsPV[24];
于 2013-01-30T16:35:05.920 に答える
0

C の配列インデックスは 0 ベースです。

float varsRA[23],varsLA[23],varsBB[23],varsPV[23]

これらの配列には、最後の有効な indexとして 22があり、23 要素になります。それが理由です

for(i=0;i<24;i++)

それぞれに 1 つの余分な要素を書き込みます。得られるのは未定義の動作です(したがって、期待するのに合理的なものは何もありません)が、特定の種類の未定義の動作は、別の配列の一部(およびおそらくランダムなメモリ位置)を上書きしています。

于 2013-01-30T16:35:02.383 に答える