Для выполнения задания часть того, что я должен сделать, включает использование malloc
и realloc
.Сначала я создаю двумерный массив символов с размерами, равными количеству строк и количеству символов.Затем я использую malloc
, чтобы выделить достаточно памяти для хранения ввода из какого-либо файла.Используя fgets
, я читаю по одной строке за раз и сохраняю ее в массиве.Эта часть работает нормально (или я так думаю).Проблема возникает, когда я пытаюсь перераспределить память для большего количества строк, если это необходимо.Программа должна выглядеть следующим образом:
Создать массив символов из 50 строк, по 80 символов в строке (работает)
Используйте fgets
для чтения по одной строке за раз исохранить его в массиве (работает)
Когда прочитано 50 строк, перераспределить массив, чтобы учесть 100 строк (не работает)
Продолжать перераспределение по мере необходимости (не работает)
Это то, что я имею до сих пор (по крайней мере, ядро, я опустил нерелевантный код):
#define NUMBER_OF_LINES 50
#define CHARACTERS_PER_LINE 80
FILE *inputFile = fopen("some.text", "r");
char **lines;
lines = malloc(NUMBER_OF_LINES * sizeof(*lines));
int i;
for (i = 0; i < NUMBER_OF_LINES; i++)
*(lines+i) = malloc(CHARACTERS_PER_LINE * sizeof(char));
int linesRemaining = NUMBER_OF_LINES;
int reallocCount = 1;
i = 0;
while (!feof(inputFile)) {
if (!linesRemaining) {
reallocCount++;
lines = realloc(lines, (NUM_OF_LINES * reallocCount) * sizeof(*lines));
linesRemaining = NUM_OF_LINES;
}
fgets(*(lines+i), CHARS_PER_LINE, inputFile);
i++;
linesRemaining--;
}
Моя интуиция говорит мне, что проблема в realloc
, поэтому яЯ объясню, что я думаю делает.
realloc(lines, (NUM_OF_LINES * reallocCount) * sizeof(*lines));
Первый аргумент lines
- это указатель, который я хотел бы перераспределить определенное количество памяти.NUM_OF_LINES
- это сумма, на которую я бы хотел увеличить размер.Я умножаю это на reallocLinesCount
, это счетчик, который отслеживает, сколько наборов из 50 линий мне нужно иметь.sizeof(*lines)
часть имеет размер указателя на char
.
Спасибо за чтение, и любая помощь очень ценится:)
РЕДАКТИРОВАТЬ: спасибо всем за ответы;У меня сейчас нет времени, чтобы прочитать все ответы прямо сейчас, но все ваши ответы будут более внимательно прочитаны и поняты, как только этот неизбежный срок истечет: D