2016-12-28 13 views
1

tail->next=(list)malloc(sizeof(node))にエラーが表示されます。誰かが私に理由を教えてくれますか?このコードはNPTELビデオの1つで教えられていますが、そこには何のエラーもなく実行されます。リンクリスト内でポインタを参照しない

tail->next=(list)malloc(sizeof(node))に問題はありますか?

#include<stdio.h> 
#include<stdlib.h> 

main(){ 
    int choice,dat; 

    typedef struct { 
     int data; 
     struct node* next; //pointer to a node 
    }node; 

    typedef node* list; 

    list head,tail; 

    head=tail=NULL; 

    printf("Enter Data? (1/0)\n"); 
    scanf("%d",&choice); 

    if(choice==1) 
    { 
     printf("Give Data?\n"); 
     scanf("%d",&dat); 
     tail=(list)malloc(sizeof(node)); 
     tail->data=dat; 
     tail->next=NULL; 
     head=tail; 

     printf("Enter Data? (1/0)\n"); 
     scanf("%d",&choice);   
    } 

    while(choice==1){ 
     printf("Give Data?\n"); 
     scanf("%d",&dat); 

     tail->next=(list)malloc(sizeof(node));//showing error 
     tail->next->data=dat; 
     tail->next->next=NULL; 
     tail=tail->next; 
    } 

    tail=head; 

    while(tail!=NULL){ 
     printf("%d",tail->data); 
     tail=tail->next; 
    } 
} 

答えて

1

コードを正常にコンパイルするには、次のようにノードタイプを宣言する必要があります。

この追加命名の理由は、typedefで始まるステートメントの最後まで宣言されていないためです。そのため、内部に独自の型へのポインタを宣言できるように、構造体の名前を付ける必要があります。

また、あなたが問題があると言及した行しようとすると、尾がNULLに等しくすることができるようだ:

tail->next=(list)malloc(sizeof(node));//showing error 

を入力した値は、最初のif文の前のscanfを経由して、変数の選択に読み込まない限り、 1、最初のwhileループが開始し、アクセスしようとすると(すなわち、割り当てられたスペースのアドレスを割り当てるために)tailがNULLになります。tail->次にはNULLを参照解除することに相当します。アドレスにアクセスしようとしています。フィールド、セグメント違反の原因となります。

1

あなたの問題はここにある:あなたが前方にあなたの(匿名)構造体nodeとは異なるタイプとしてstruct nodeを宣言している

typedef struct { 
    int data; 
    struct node* next; // <-- problem 
} node; 

。あなたが定義の中に参照できるように

あなたは、名前node STRUCT匿名を与えることによってこの問題を解決することができます

typedef struct node { 
    int data; 
    struct node* next; 
} node; 

は今nodeという名前だけ一種類があります。


また、main関数には戻り値の型がありません。次のようになります。

int main() { 
+0

ありがとうございます!出来た :) –

関連する問題