c - fscanf 将输出写入变量的索引中

标签 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:然后突然“c”得到值 42(“核心”实际上应该得到这个值):

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]);

如果有任何拼写/语法错误,我深表歉意;英语不是我的母语。

最佳答案

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

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

相关文章:

c - zip 文件 我正在尝试获取输入文件并压缩字母。

c++ - 在c中访问越界数组

c++/g++ 比较 WORD 和 CHAR 的魔数(Magic Number)

linux - 如何制作 ubuntu 可执行文件并在我的安装文件中运行它

django - 使用 Vagrant 进行端口转发时连接重置

linux - x265 : I don't get full statistics per frame during encoding process

c - #在C中定义一个输入数字

c++ - 使用 MetroWerks C/C++ 开发的 C/C++ 资源

c++ - 如果文件是可执行的,为什么我需要安装一些依赖项?

c++ - 指针数组,如 (*(volatile unsigned long *)0x40004000)