我正在尝试编写交流程序来监控处理器的温度。为了测试我的程序,我使用 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 的第三次(也是最后一次)调用之前,一切都按预期工作:然后突然 '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)时,一切都按预期工作。但是,当使用二进制最后两位数字为“11”的数字时(例如 3、7、11、15,...),程序将崩溃。当声明另一个整数并将其设置为“0”时,当“CORECOUNT”的值为“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]);
如果有任何拼写/语法错误,我很抱歉;英语不是我的母语。