Это из краткого прочтения, поэтому я мог пропустить несколько вопросов.
Во-первых, a = realloc(a, ...);
не так.В случае сбоя realloc()
возвращается NULL
, но исходная память не освобождается.Так как вы переназначаете a
, оригинальная память теряется (т.е. это утечка памяти).Правильный способ сделать это: tmp = realloc(a, ...); if (tmp) a = tmp;
и т. Д.
Во-вторых, при определении размера файла с помощью fseek(fp, 0, SEEK_END);
обратите внимание, что это может работать, а может и не работать.Если файл не имеет произвольного доступа (например, stdin
), вы не сможете вернуться к началу, чтобы прочитать его.Кроме того, fseek()
, за которым следует ftell()
, могут не дать значимого результата для двоичных файлов.А для текстовых файлов может не указываться нужное количество символов, которые можно прочитать.По этой теме есть некоторая полезная информация по comp.lang.c
FAQ вопрос 19.2 .
Кроме того, в исходном коде вы не устанавливаете index
в 0, когда оно равно PAGESIZE
, поэтому, если длина вашего файла превышает 2*PAGESIZE
, вы перезапишите буфер.
Ваша функция freecontent()
:
static void freecontent(char *content)
{
if(content) {
free(content);
content = NULL;
}
}
бесполезна.Он устанавливает только копию от content
до NULL
.Это похоже на то, как если бы вы написали функцию setzero
, например:
void setzero(int i) { i = 0; }
Гораздо лучшая идея - следить за памятью самостоятельно, а не освобождать что-либо более или менее необходимое.
Не следует приводить возвращаемое значение malloc()
или realloc()
в C, поскольку void *
неявно преобразуется в любой другой тип указателя объекта в C.
Надеюсь, что это поможет.