fscanf записывает вывод в индекс переменной

Я пытаюсь написать программу для контроля температуры моего процессора. Чтобы проверить мою программу, я читаю целые числа из файла, используя 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" в качестве последних двух цифр в двоичном виде. Если это не так, "ядро" иногда получает странные значения (например, "15274000", которые не совпадают при каждом запуске программы).

Как ни странно, это происходит только в gcc 4.6.3, но не в gcc 4.8

Где ошибка в моем коде? Или это даже что-то в компиляторе (в чем я сильно сомневаюсь)?

сейчас я объявлю еще одну переменную ('tmp') и буду использовать ее в качестве индекса при вызове fscanf:

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

Извините, если есть какие-либо орфографические / грамматические ошибки; Английский не мой родной язык.

1 ответ

Решение

В твои за петли меняй c<=CORECOUNT в c<CORECOUNTВы объявили массивы размером [CORECOUNT], поэтому, когда CORECOUNT равен 3, у вас есть элементы [0], [1], [2]. Имея c<=CORECOUNT в вашем цикле for, вы пытаетесь получить доступ к элементу [3], так что память вне массива повреждена.

Другие вопросы по тегам