2013-06-28 2 views
1

아래 코드는 동일한 디렉토리에서 텍스트 파일을 읽고 각 행을 역순으로 파일에 인쇄합니다. 예를 들어, 텍스트 파일 내가 읽은 :
라인 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; 

} 

답변

0

이것은 'L1'은 구조체 또한 메모리 블록에 대한 포인터 모두 포인터 것을 의미한다.

나는이 문제가 무엇인지 이해하지 못합니다. 구조체 은 메모리에 있고 은 일부 메모리 블록을 차지합니다.

그리고이 모든 코드는 연결된 목록을 작성한 다음 역방향으로 진행합니다.

+0

그 대신 주소가 l1에 할당 된 할당 된 메모리 블록을 가리키고 있음을 의미합니다.이 메모리 블록은 비어 있지만 할당 된 블록입니다. – Shiri

+0

@Shiri'malloc (sizeof line)'은 어떻게 생각하십니까? –

+0

struct-type 라인에 맞게 충분히 큰 메모리 블록을 만들고 주소를 반환합니다 ... 맞습니까? – Shiri