以相反顺序读取文件行(结构、成员、malloc)

以相反顺序读取文件行(结构、成员、malloc),c,pointers,memory,struct,malloc,C,Pointers,Memory,Struct,Malloc,下面的代码读取同一目录中的文本文件,并按相反顺序打印文件中的每一行。例如,我读过的文本文件: 第1行 第2行 第3行 它会打印出来: 第3行 第2行 第1行 确实如此,那么真正的问题是什么呢?这个问题与其说是关于修复一些代码的功能性,不如说是关于理解代码及其背后的逻辑,以及如何实现它 我对C非常陌生(已经学习了几天),所以如果我不懂一些相对简单的东西,请不要尖叫 问题是: 在第一个while循环中,我分配了足够大的内存块来存储结构类型'line',并定义了'line'类型的指针'l1'来保存这个

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

它会打印出来:
第3行
第2行
第1行

确实如此,那么真正的问题是什么呢?这个问题与其说是关于修复一些代码的功能性,不如说是关于理解代码及其背后的逻辑,以及如何实现它

我对C非常陌生(已经学习了几天),所以如果我不懂一些相对简单的东西,请不要尖叫

问题是:

在第一个while循环中,我分配了足够大的内存块来存储结构类型'line',并定义了'line'类型的指针'l1'来保存这个分配内存的地址。现在问题来了。在下面的代码行中,另一个内存块被分配给一个字符串,该字符串具有足够大的缓冲区,可以容纳文本文件中读取的每个字符串的大小,该文本文件的指针定义为l1->lines

对我来说,这似乎不合逻辑,因为“l1”只被定义为“line”类型的指针,但在while循环的第二行,“l1->line”表明我已声明了一个名为“l1”的“line”类型的结构,并且我正在访问它的一个成员(“line”)并且我分配这个结构成员的地址作为新分配的内存块的地址。这意味着“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;

}
#包括
#包括
#包括
typedef结构行{
字符*行;
结构行*prev;
}线路;
文件*文件;
int main(){
行*尾=空;
file=fopen(“text.txt”、“r”);
char line1[80];
while(fgets(第1,80行,文件)!=NULL){
行*l1=malloc(sizeof(行));
l1->lines=malloc(strlen(line1)+1);
strcpy(l1->行,行1);
l1->prev=尾部;
尾=l1;
}
线路*电流;
电流=尾部;
while(当前!=NULL){
printf(“%s\n”,当前->行);
当前=当前->上一个;
}
返回0;
}
这意味着“l1”既是指向结构的指针,也是指向内存块的指针

我不明白这有什么问题。结构驻留在内存中,并且占用一些内存块。


顺便说一句,这些代码所做的就是建立一个链表,然后向后遍历。

我的意思是,它指向一个分配的内存块,其地址分配给l1,l1是一个空的但已分配的块。@Shiri你认为
malloc(sizeof line)怎么样
does?创建一个足够大的内存块,以适合结构类型行并返回其地址。。。对吗?所以l1然后指向这个分配的内存块作为类型行指针。然而,作为一个指针,它通过l1->行访问其成员(如声明的结构),我不明白内存中是否不存在真正的结构,如果l1只是被定义为指向分配内存块的指针…?@Shiri“不存在真正的结构”是什么意思?再说一遍,
malloc()
刚才做了什么?