2017-03-16 1 views
-2
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h>' 

typedef struct NodeClass { 

    char lineThatContainsWord[100]; 
    int lineNumber; 
    struct NodeClass *next; 

} Node; 

int main(void) { 
    Node *head; 
    head = malloc(sizeof(Node)); 
    Node *tail = NULL; 

    head->next = tail; /* sets head equal to NULL */ 
    strcpy(head->lineThatContainsWord,"hello"); 
    head->lineNumber = 5; 
    free(head); 

    head->next = malloc(sizeof(Node)); 
    head->next->next = NULL; 
    strcpy(head->next->lineThatContainsWord,"hello2"); 
    head->next->lineNumber = 10; 

    tail = head->next; 
    free(tail); 
    printf(tail->lineThatContainsWord); 
    printf("\nlineNumber is %d",tail->lineNumber); 

    return 0; 
} 

나는 tail = head-> next를 설정하여 head-> next 노드의 값을 인쇄한다고 가정했습니다. 그러나 인쇄 된이LinkedList C에서 free() 및 메모리 할당 사용

hello2 
lineNumber is 0 

왜 lineThatContainsWord 만 업데이트 되었습니까? lineNumber가 왜 안되 었습니까?

답변

1

메모리를 확보 한 후 headtail이 가리키는 메모리에 액세스하므로 정의되지 않은 동작이 발생합니다 (프로그램을 시도 할 때 세그먼트 위반 오류가 발생하지만이 작업에 의존 할 수 없음). free(head);free(tail); 라인 제거, 프로그램이 인쇄됩니다 : 예상대로

hello2 
lineNumber is 10 

.

+0

내 할당을 의미 생각합니다. 그러나 자유 변수가 단순히 가리키는 데이터를 해제한다는 것을 읽었습니다. 데이터에 액세스 한 후 데이터를 공개하면 어떻게 해방 될 수 있습니까? – csDS

+0

메모리 사용을 끝내면 다른 것을 사용할 수 있도록 메모리를 비우십시오. – Barmar

+0

프로그래머가 절대 구조체를 해제하지 않으면 매우 실용적이지 않습니까? 그들의 메모리 할당을 비효율적으로 만들 것입니다, 맞습니까? – csDS

0

출력 할 노드의 노드를 삭제할 때 프로그램에서 출력 할 것으로 예상되는 내용은 무엇입니까?

은 내가 인쇄이 일 후에 내가 그들을 해방 있도록 변수를 무료로 저를 필요로 다음과 같은

Node *head = malloc(sizeof(Node)); 

head->next = NULL; /* sets next equal to NULL */ 
strcpy(head->lineThatContainsWord,"hello"); 
head->lineNumber = 5; 

Node *tail = head; 

tail->next = malloc(sizeof(Node)); 
tail->next->next = NULL; 
strcpy(tail->next->lineThatContainsWord,"hello2"); 
tail->next->lineNumber = 10; 

tail = tail->next; 

printf(tail->lineThatContainsWord); 
printf("\nlineNumber is %d",tail->lineNumber); 

free(tail); 
free(head); 
관련 문제