fscanf将输出写入变量索引

时间:2014-04-06 16:34:44

标签: c gcc ubuntu-12.04 scanf gcc4.6

我正在尝试编写一个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的第三次(和最后一次)调用:然后突然&#39; c&#39;获得值42(核心&#39;实际应该得到):

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]。

使用&#39; CORECOUNT&#39;的其他值时? (例如4)一切都按预期工作。但是,当使用具有&#39; 11&#39;作为二进制的最后两位数(例如3,7,11,15 ......),程序将崩溃。声明另一个整数并将其设置为&#39; 0&#39;当“CORECOUNT”&#39; CORECOUNT&#39;有一个值为&#39; 11&#39;作为二进制的最后两位数。如果情况并非如此&#39;核心&#39;有时会得到奇怪的值(例如&#39; 15274000&#39;,每次执行程序时都不一样)。

奇怪的是,这只发生在gcc 4.6.3中,而不是发生在gcc 4.8

我的代码中的错误在哪里?或者它甚至是编译器中的东西(我非常怀疑)?

就目前而言,我将声明另一个变量(&#39; tmp&#39;)并将其用作fscanf调用中的索引:

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

对不起,如果有任何拼写/语法错误;英语不是我的母语。

1 个答案:

答案 0 :(得分:1)

在for循环中,将c<=CORECOUNT更改为c<CORECOUNT 您已声明大小为[CORECOUNT]的数组,因此当CORECOUNT为3时,您有元素[0],[1],[2]。在for循环中使用c&lt; = CORECOUNT,您尝试访问元素[3],因此数组外部的内存已损坏。