2013-06-28 5 views
1

Код ниже читает текстовый файл в том же каталоге и печатает каждую строку в файле в обратном порядке. Например, текстовый файл я прочитал:
линия 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; 

} 

ответ

0

Это означает, что «l1» является указателем как на структуры, а также указатель на блок памяти.

Я не понимаю, в чем проблема с этим. Структура находится в памяти и занимает несколько блоков памяти.

И все, что этот код делает, кстати, строит связанный список, а затем проходит через него назад.

+0

Скорее я имел в виду, что он указывает на выделенный блок памяти, адрес которого назначен l1, который является пустым, но выделенным блоком. – Shiri

+0

@Shiri Как вы думаете, 'malloc (sizeof line)' делает? –

+0

Создает блок памяти, достаточно большой, чтобы соответствовать структуре типа и возвращать его адрес ... правильно? – Shiri