2017-03-16 17 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()とメモリ割り当てを使用するC

hello2 
lineNumber is 0 

なぜ、lineThatContainsWordが更新されたのですか?なぜlineNumberはなかったのですか?

答えて

1

メモリを解放した後にheadとが指すメモリにアクセスするため、未定義の動作が発生しています(プログラムを試したときにセグメンテーション違反エラーが発生しましたが、これに依存できません)。 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); 
関連する問題