아래 코드는 동일한 디렉토리에서 텍스트 파일을 읽고 각 행을 역순으로 파일에 인쇄합니다. 예를 들어, 텍스트 파일 내가 읽은 :
라인 1
라인이
라인 인쇄 한 것 3역순으로 파일 행 읽기 (Structs, members, malloc)
:
라인 3
라인이
라인 1
과 그렇다면 진짜 문제는 무엇인가? 이 질문은 필자에게 약간의 도움이되는 코드의 기능을 수정하는 것이 아니라 코드의 기능과 코드의 논리 및 그 기능을 수행하는 방법에 대한 이해에 관한 것입니다.
저는 C 언어에 익숙하지 않습니다. (며칠 동안 학습 했으므로) 비교적 간단한 것을 이해하지 못하면 비명을 지르지 마십시오.
질문 : 제 1 내지 제
루프 I가 구조체 형 '라인'을 저장하기에 충분히 큰 메모리 블록을 할당하고이 주소를 보유하는 형태 '라인'의 포인터 'L1'를 정의하면서 할당 된 메모리. 이제 여기에 문제가 있습니다. 아래의 코드 행에서이 다른 메모리 블록은 포인터가 l1-> lines로 정의 된 텍스트 파일에서 읽은 각 문자열의 크기를 보유 할만큼 충분히 큰 버퍼가있는 문자열에 할당됩니다.
나에게 이것은 'l1'이 'line'유형의 포인터로 정의되었지만이 while 루프의 두 번째 행에서는 'l1-> lines'이 구조체를 선언했다는 것을 나타냅니다. 'l1'이라는 'line'을 입력하고 멤버 ('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)'은 어떻게 생각하십니까? –
struct-type 라인에 맞게 충분히 큰 메모리 블록을 만들고 주소를 반환합니다 ... 맞습니까? – Shiri