我正在尝试编写一个c程序来监视处理器的温度。
为了测试我的程序,我使用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”,则程序将按预期工作。如果不是这种情况,“核心”有时确实会得到奇怪的值(例如,“ 15274000”,每次执行程序时这些值都不相同)。

足够奇怪,这仅在gcc 4.6.3中发生,而在gcc 4.8中不发生

我的代码中的错误在哪里?或者甚至是编译器中的某些东西(我对此表示高度怀疑)?

刚才,我将声明另一个变量('tmp')并将其用作fscanf调用中的索引:

printf("c=%d\n", c);
tmp=c;
fscanf(cmd[c], "%d", &core[tmp]);


如果有任何拼写/语法错误,我感到抱歉。英语不是我的母语。

最佳答案

在for循环中,将c<=CORECOUNT更改为c<CORECOUNT
您已声明大小为[CORECOUNT]的数组,因此,当CORECOUNT为3时,将具有元素[0],[1],[2]。在for循环中具有c

关于c - fscanf将输出写入变量的索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22896836/

10-11 04:40