Код ниже читает текстовый файл в том же каталоге и печатает каждую строку в файле в обратном порядке. Например, текстовый файл я прочитал:
линия 1
линия 2
линия 3Чтение строк в обратном порядке (Structs, members, malloc)
который бы распечатано:
линия 3
линия 2
линия 1
и делает, так в чем же проблема? Этот вопрос заключается не столько в исправлении функциональности какого-то кода, который я немного помог в письменной форме, но и в более глубоком понимании кода и логики того, что он делает и как он его выполняет.
Я очень новичок в C (учился в течение нескольких дней), поэтому, пожалуйста, не кричите, если я не понимаю что-то относительно простое.
ВОПРОС:
В первом во время цикла я выделил блоки памяти достаточно большой, чтобы хранить структуры типа «линейный» и определил указатель «l1» типа «линии», чтобы содержать адрес этого выделенная память. Теперь вот проблема. В строке кода ниже этот другой блок памяти выделяется для строки с достаточно большим буфером для хранения размера каждой строки, считанной в текстовом файле, указатель которого обозначен как l1-> lines.
Для меня это кажется нелогичным, поскольку 'l1' определяется только как указатель типа 'line', но во второй строке этого цикла while строки 'l1->' предполагают, что я объявил структуру type 'line' named 'l1', и я обращаюсь к одному из его членов ('lines') и присваиваю адрес этого элемента структуры как адрес вновь выделенного блока памяти. Это означает, что 'l1' является указателем на структуру, а также на указатель на блок памяти.
Из всего этого я могу ясно сказать, что мое понимание происходящего искажено и ни в коем случае не является правильным. Может кто-нибудь, пожалуйста, просветит меня на том, что кажется тривиальной проблемой?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct line {
char *lines;
struct line *prev;
} line;
FILE *file;
int main() {
line *tail = NULL;
file = fopen("text.txt","r");
char line1[80];
while (fgets(line1,80,file)!=NULL) {
line *l1 = malloc(sizeof(line));
l1->lines = malloc(strlen(line1)+1);
strcpy(l1->lines,line1);
l1->prev = tail;
tail = l1;
}
line *current;
current = tail;
while (current != NULL) {
printf("%s\n",current->lines);
current = current->prev;
}
return 0;
}
Скорее я имел в виду, что он указывает на выделенный блок памяти, адрес которого назначен l1, который является пустым, но выделенным блоком. – Shiri
@Shiri Как вы думаете, 'malloc (sizeof line)' делает? –
Создает блок памяти, достаточно большой, чтобы соответствовать структуре типа и возвращать его адрес ... правильно? – Shiri