以相反的顺序读取文件行(Structs,members,malloc)

时间:2013-06-28 09:47:39

标签: c pointers memory struct malloc

下面的代码读取同一目录中的文本文件,并以相反的顺序打印文件中的每一行。例如,我读过的文本文件:
第1行 第2行 第3行

本来打印出来的:
第3行 第2行 第1行

它确实如此,那真正的问题是什么?这个问题不是关于修复某些代码的功能,而是在写作方面有所帮助,而是更多地了解代码及其背后的逻辑以及它如何实现它。

我是C的新手(已经学习了几天)所以如果我不理解相对简单的事情,请不要尖叫。

问题:

在第一个while循环中,我已经分配了足够大的内存块来存储struct-type'line',并定义了'line'类型的指针'l1'来保存这个分配的内存的地址。现在这是问题所在。在下面的代码行上,另一个内存块被分配给一个字符串,该字符串的缓冲区大到足以保存在文本文件中读取的每个字符串的大小,其指针被定义为l1-> line。

对我来说,这似乎是不合逻辑的,因为'l1'被定义为仅仅是'line'类型的指针,但是在这个while循环的第二行,'l1->行'表示我已经声明了一个结构输入名为'l1'的'line',我正在访问其中一个成员('lines'),并将此struct成员的地址指定为新分配的内存块的地址。这意味着'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;

}

1 个答案:

答案 0 :(得分:0)

  

这意味着'l1'是指向结构的指针,也指向内存块的指针。

我不明白这个问题是什么。结构驻留在内存中占用一些内存块。

顺便说一句,所有这些代码都构建了一个链接列表,然后向后遍历它。