2017-02-25 19 views
-1

私はこれらの構造を書いてリンクされたリストへのリンクを追加する機能を持っていましたが、私はセグメンテーションフォルトを取得します。なぜそれが起こっているのですか?cのリンクリスト内の構造体にメモリを割り当てる方法は?

typedef struct primaries_date{ 
    int day; 
    int month; 
    int time; 
} primaries_date; 

typedef struct usa_primaries { 
    primaries_date *date; 
    char *state; 
    int open; 
    struct usa_primaries *next; 
} usa_primaries; 

usa_primaries *head = NULL; 

void insert(int day, int month, int time, char *state, int open){ 
    usa_primaries *temp, *entry = (usa_primaries  *)malloc(sizeof(usa_primaries)); 
    entry->date = (primaries_date *)malloc(sizeof(primaries_date)); 
    if(entry == NULL || entry->date==NULL){ 
     printf("error couldnt allocate memory"); 
     return; 
    } 
    entry->date->day = day; 
    entry->date->month = month; 
    entry->date->time = time; 
    entry->state = state; 
    entry->open = open; 

    if(head ==NULL){ 
     head = entry; 
    } else { 
     temp = head; 
     while(temp!=NULL) 
      temp = temp->next; 
     temp->next = entry; 
    } 
    entry->next = NULL; 
} 

私は問題が日付構造のメモリ割り当てにあると確信していると思います。

+0

'malloc'の戻り値をキャストしないでください。 – aschepler

+0

彼はそうではありませんが、一時的なポインタを定義すると、私には悪いと感じます。初期化された変数宣言と初期化されていない変数宣言を混在させることは既に可能ですが、非常に小さなサブスコープにしか存在しないときに関数の入り口で変数を宣言することは悪いです。 –

答えて

2

tempには、NULLと等しくなるまで反復処理が行われているため、逆参照しています。 whileループの条件はtemp->next != NULLです。

+0

また、 'if(entry == NULL || entry-> date == NULL)'と書かないと、sucsessfullyなので、彼は自由を得られず、あなたは再び彼を解放することはできません。非自由な記憶で混乱しないでください。 –

+0

@רועיאבידן、なぜ彼はそれを書いてはいけないのですか?最初の条件が満たされている場合、2番目の条件は評価されません。最初に失敗した場合は、2番目に評価することは安全です。何かそれに間違っている?彼のバグは、最初の 'malloc'が失敗した場合、' entry-> date = 'という代入が失敗するということです。 –

+0

ありがとう!ループを終了する条件は実際には – tomslu

関連する問題