以下のコードは、同じディレクトリにあるテキスト ファイルを読み取り、ファイルの各行を逆の順序で出力します。たとえば、私が読んだテキスト ファイル:
1
行目 2
行目 3 行目
3行
目 2
行目 1 行 目
本当の問題は何ですか?この質問は、私が書くのを少し手伝ったコードの機能を修正することについてではなく、コードとその背後にあるロジックを理解し、それがどのようにそれを達成するかについてのものです。
私は C に非常に慣れていない (数日間学習している) ので、比較的単純なことを理解できなくても悲鳴を上げないでください。
質問:
最初の while ループでは、struct-type 'line' を格納するのに十分な大きさのメモリ ブロックを割り当て、この割り当てられたメモリのアドレスを保持するためにタイプ 'line' のポインタ 'l1' を定義しました。ここで問題です。この下のコード行では、ポインターが l1->lines として定義されているテキスト ファイルで読み取られた各文字列のサイズを保持するのに十分な大きさのバッファーを持つ文字列用に、別のメモリ ブロックが割り当てられます。
'l1' はタイプ 'line' のポインターとしてのみ定義されているため、これは非論理的に思えますが、この while ループの 2 行目にある 'l1->lines' は、タイプ 'line' の構造体を宣言したことを示唆しています。 'l1' という名前で、そのメンバー ('lines') の 1 つにアクセスし、この構造体メンバーのアドレスを新しく割り当てられたメモリ ブロックのアドレスとして割り当てています。これは、'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;
}