プロセッサの温度を監視する ac プログラムを作成しようとしています。プログラムをテストするために、fscanf を使用してファイルから整数を読み取りました。驚いたことに、これは特定の条件下では機能しません。次のコードを使用しています。
#include <stdio.h>
#define CORECOUNT 3
int main()
{
int c=0;
int core[CORECOUNT]={0};
FILE *cmd[CORECOUNT];
for (c=0; c<=CORECOUNT; c++) //read input and store it in 'core'
{
cmd[c]=fopen("testinput", "r");
printf("c=%d\n", c);
fscanf(cmd[c], "%d", &core[c]);
printf("core[c]=%d, z=%d\n", core[c], c);
fclose(cmd[c]);
}
for (c=0; c<=CORECOUNT; c++) //print input
{
printf("core%d: %d ", c, core[c]);
}
printf("\n");
}
エラーなしでコンパイルされます。fscanf の 3 回目 (そして最後) の呼び出しまで、すべてが期待どおりに機能します。その後、突然 'c' が値 42 を取得します (実際には 'core' が取得する必要があります)。
c=0
core[z]=42, z=0
c=1
core[z]=42, z=1
c=2
core[z]=42, z=2
c=3
core[z]=1, z=42
Segmentation fault (core dumped)
fclose が存在しない cmd[42] を閉じようとするため、セグメンテーション違反が発生します。
「CORECOUNT」の他の値 (例: 4) を使用すると、すべてが期待どおりに機能します。ただし、2 進数の最後の 2 桁が「11」である数値 (3、7、11、15 など) を使用すると、プログラムがクラッシュします。別の整数を宣言して「0」に設定すると、「CORECOUNT」の値が 2 進数の最後の 2 桁が「11」の場合、プログラムは期待どおりに動作します。そうでない場合、'core' はときどき奇妙な値を取得します (たとえば、'15274000' は、プログラムが実行されるたびに同じではありません)。
奇妙なことに、これは gcc 4.6.3 でのみ発生し、gcc 4.8 では発生しません。
私のコードのどこにエラーがありますか? それとも、コンパイラの何かですか(私は非常に疑っています)?
ここでは、別の変数 ('tmp') を宣言し、fscanf の呼び出しでインデックスとして使用します。
printf("c=%d\n", c);
tmp=c;
fscanf(cmd[c], "%d", &core[tmp]);
つづりや文法の誤りがありましたら申し訳ありません。英語は私の母国語ではありません。