Я получил эту функцию:
#define DIGITS_MAXIMUM_NUMBER 10
int* read_from_file(const char* file_name)
{
int limit = 101;
int *values = (int *) malloc(sizeof(int) * limit);
FILE *fp = fopen(file_name, "r");
char string_value[DIGITS_MAXIMUM_NUMBER];
int i = 1;
while(fgets(string_value, DIGITS_MAXIMUM_NUMBER, fp) != NULL)
{
if (i >= limit) {
limit += 100;
values = realloc(values, limit);
}
values[i] = atoi(string_value);
i++;
if ( i >= 106 )
printf("%d\n", i);
}
values[0] = i;
if (i != limit)
values = realloc(values, i);
fclose(fp);
return values;
}
Я получаю ошибку сегментации на 106-й итерации, это означает, что цикл работает, но на этой определенной итерации, когда выполняется fgets, возникает ошибка сегментации.
Если кто-нибудь знает почему или имеет хотя бы свое мнение, было бы здорово поделиться, спасибо.
values = realloc(values, limit);
==> values = realloc(values, sizeof *values * limit);
и то же несколькими строками ниже
Всегда проверяйте, удалось ли fopen
.
@pmg Вы можете опубликовать это как ответ на вопрос.
Предложение: unsigned read_from_file(int **dst, const char *file_name);
... верните количество значений напрямую и поместите значения в переданный указатель. Специальный values[0]
больше не нужен :-)
Также было бы неплохо проверить, вернулось ли распределение памяти NULL
.
char string_value[DIGITS_MAXIMUM_NUMBER];
слишком мал, чтобы сохранить "-2147483648\n"
в виде строки. Предложите char string_value[DIGITS_MAXIMUM_NUMBER + 3]; ... while(fgets(string_value, sizeof string_value, fp) != NULL)
.
Немедленное решение:
// values = realloc(values, limit);
values = realloc(values, sizeof *values * limit);
Однако вы можете многое улучшить!
Ух ты, должен сказать, я впечатлен. Я всегда думал, что знаю язык C очень хорошо, но на этот раз, кажется, я понял, что мне еще многому нужно научиться.
Правильно ли вы используете возвращаемый указатель в вызывающей функции?