char reds [13];
Это выделяет массив символов фиксированного размера с 13 элементами;он может содержать одну строку длиной до 12 char
с (плюс терминатор NULL).Это не то, что вы хотели.
char *reds = malloc (sizeof(char));
Это создает новую переменную reds
, которая скрывает ту, которую вы объявили выше.Это указатель на массив, в котором достаточно места только для одного char
;он может содержать только пустую строку (терминатор NULL).Это также не то, что вы намеревались.
fscanf (file, "%s", &reds[i]);
Это передает fscanf()
указатель на i
'-ый элемент (оригинального) reds
массива.Поскольку reds
имеет 13 элементов, это означает, что если строка, хранящаяся в fscanf()
, содержит более 12 - i
символов в любой итерации цикла, поведение будет неопределенным.Опять же, не то, что вы хотели.
То, что вы, вероятно, хотели сделать, было примерно так:
char *reds[13]; // an array of 13 POINTERS
// later, in your loop...
reds[i] = malloc(sizeof(char) * (max_string_length + 1));
fscanf(file, "%s", reds[i]); // see note below
1) Не забудьте free()
указатели, которые вы выделяетес malloc()
или ваша программа будет иметь утечку памяти.В вашем примере это не имеет большого значения, потому что программа выходит сразу (освобождая память), но если это не так, память будет вытекать, поэтому вы должны выработать хорошие привычки.
2) Этовсе еще возможно вызвать неопределенное поведение, если fscanf()
хранит строку длиннее max_string_length
;Вы можете улучшить это далее, передав максимальную ширину, указанную для fscanf()
.
3) sizeof(char)
гарантированно равно 1, поэтому вы можете опустить это, если хотите (хотя естьесли вы предпочитаете это, не повредит, если вы предпочитаете это).
4) Проверьте ошибки, верните ли вы значения malloc()
, fscanf()
, fopen()
и т. д. Если вы этого не сделаете, ипроисходит ошибка, ваша программа может легко вызывать неопределенное поведение, которое может быть трудно отладить.Избавь себя от боли и развивай эту привычку сейчас.