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], так что память вне массива повреждена.