У вас просто указатель, не более того. Вам нужно выделить память, используя malloc()
.
На самом деле вам нужно сначала выделить память для указателей, а затем выделить память для строк.
N строк, каждая M символов:
char** lines = malloc(sizeof(*lines) * N);
for (int i = 0; i < N; ++i) {
lines[i] = malloc(sizeof(*(lines[i])) * M);
}
Вы также берете адрес и сразу же разыменовываете его - что-то вроде *(&foo)
практически не имеет смысла.
Для обновленного кода
О, в этом коде столько неправильного ...
- Вам нужно включить
stdlib.h
, чтобы использовать malloc()
lines
не объявлено. char** lines
отсутствует до того, как l oop if
в l oop проверяет, соответствует ли line_no
0
. Если да, то выделяется lines
. Проблема в том, что переменная line_no
равна 0
- sizeof(*lines)
умноженное на 0, все равно равно нулю. Память не выделяется. - Но! В начале l oop стоит
++line_no
, поэтому line_no
никогда не равно 0, поэтому malloc()
вообще не вызывается. lines[line_no-1] = buffer;
- он не копируется из buffer
- lines[line_no-1]
, он просто назначает указатели. Чтобы скопировать строки в C, вам нужно использовать strcpy()
fgets()
добавляет новый символ строки в конец буфера - вы, вероятно, захотите удалить его: buffer[strcspn(buffer, "\n")] = '\0';
- Аргумент
len
никогда не используется. char buffer[buffer_length];
- не используйте VLA - Лучше увеличить
line_no
в конце l oop вместо постоянного вычисления line_no-1
- В C результат приведения
malloc()
не является обязательным - Нет проверки, если открытие файла не удалось
- Вы не освобождаете память
Учитывая все это, я быстро «поправил» его до такого состояния:
void read_file(char const* name)
{
FILE* file = fopen(name, "r");
if (file == NULL) {
return;
}
int buffer_length = 1024;
char buffer[1024];
char** lines = malloc(0);
int line_no = 0;
while (fgets(buffer, buffer_length, file)) {
buffer[strcspn(buffer, "\n")] = '\0';
printf("---%s\n", buffer);
lines = realloc(lines, sizeof (*lines) * (line_no+1));
lines[line_no] = malloc(sizeof (*lines[line_no]) * buffer_length);
strcpy(lines[line_no], buffer);
printf("-------%s--------\n", lines[line_no]);
++line_no;
}
fclose(file);
for (int i = 0; i < line_no; ++i) {
free(lines[i]);
}
free(lines);
}