2012-04-03 8 views
0

ある構造内のポインターを別の構造のノードに向けようとしています。私は今この10時間で立ち往生しています。誰かが自分のコードを修正するのを手助けできますか? curr_users -> playlist = p_playlists;にセグメンテーションフォルトが発生しています。それを間違って指摘していますか?リンクリストを別のリンクリストにポインター

struct playlist_ { 
    int album; 
    int track_num; 
    struct playlist_ *next; 
}; 
typedef struct playlist_ playlists; 

struct users_ { 
    int user_ID; 
    struct playlist_ *playlist; 
    struct users_ *next; 
}; 
typedef struct users_ users; 

int transaction(FILE *transaction_file,album *all_album){ 
    int transaction_id,i; 
    int album_ID, 
     account_number, 
     add_playlist_user, 
     add_playlist_album, 
     add_playlist_track; 

    users *head_users,*curr_users,*p_users,*users_pointer; 
    playlists *head_playlists,*curr_playlists,*p_playlists,*playlist_pointer; 

    head_users = NULL; 

    fscanf(transaction_file,"%d\n",&account_number); 

    /*Checks for empty list, if true creates the first user*/ 
    if(!(head_users)){ 
    p_users = malloc(sizeof(users)); 
    p_users -> user_ID = account_number; 
    head_users = p_users; 
    head_users -> next = NULL; 
    users_pointer = head_users; 

    /*If list is not empty create new user and puts it in front of list*/ 
    }else{ 
    p_users = malloc(sizeof(users)); 
    p_users -> user_ID = account_number; 
    curr_users = p_users; 
    curr_users -> next = head_users; 
    head_users = curr_users; 
    users_pointer = head_users; 
    } 
    /*Create an empty playlist for user and set everything to null*/ 

    p_playlists = malloc(sizeof(playlists *)); 
    curr_playlists = p_playlists; 
    curr_playlists -> album = 5; 
    curr_playlists -> track_num = 5; 
    curr_playlists -> next = NULL; 
    curr_users -> playlist = p_playlists; 

エラーメッセージが受信、私はこのコードを実行すると:

エラーは、この行であるように思わ
Program received signal SIGSEGV, Segmentation fault. 
0x00011050 in transaction (transaction_file=0xff3675cc, all_album=0x226b0) 
    at functions.c:94 
94   curr_users -> playlist = p_playlists; 
+1

サイドノート:以下のような構造体を定義することができます: 'typedef struct users_ {/ * whatever * /} users;'定義とtypedefの両方を一つのステートメントで行います。さらに、 'struct user'と' users'は2つの異なるものですから、 'typedef struct users {/ * * /} users; 'というアンダースコアを削除することもできます。さらに、struct nameを削除することもできます: 'typedef struct {/ * * /} users;'私はこの最後のものをお勧めしません。 – Shahbaz

+0

チップをありがとう。 –

答えて

1

:あなたはへのポインタのための十分なメモリを割り当てている

p_playlists = malloc(sizeof(playlists *)); 

playlist_構造体では、playlist_構造体全体のメモリが不足しています。

p_playlists = malloc(sizeof(playlists)); 

playlist_構造体に十分なメモリを割り当てるには、次の行を変更します。下のコメントで示されているように

EDIT
は、あなたもelseブロックにcurr_usersに何かを割り当てる必要があります。

混乱を最小限に抑えるために、確認するために:次に、あなたのプログラム内の他のエラーがなければ、それは

+0

私は 'p_playlists = malloc(sizeof(プレイリスト));'を持っていましたが、私はこの質問を投稿する前に実験に変更しました。私はそれを元に戻しましたが、それでも私には同じエラーが出ます。 –

+0

プログラムに別のエラーがあります。プログラムが 'if(!(head_users)) '条件を指定すると、' curr_users'変数は設定されません。 'curr_users-> playlist = p_playlists; 'を呼び出すことで、間違った変数(' curr_users')を間接参照しています。これにより、segフォルトが発生します。 –

+0

これを 'if(head_users == NULL){}'に変更する必要がありますか? –

2

人々はすでに答えを与えたが、私は私が提案して、それがより完全なものだろうと思った:)動作するはずですあなたは右のそれを取得し、常にこのようmallocを使用し、特定の変更の場合には、メンテナンスの手間を最小限に抑えるために:この場合には、pointertypeは一度しか言及されていることを

type *pointer = malloc(count * sizeof(*pointer)); 

注意。変更された場合は、残りのコードに触れる必要はありません。また、sizeof(*pointer)は、常にpointerに存在する可能性のある要素のサイズを正しく示しています。


今すぐ戻ってあなたのコードを取得するには、あなたは次のローカル変数を持っていることに気づいた:

users *head_users, *curr_users, *p_users, *users_pointer; 

初期化されていない、とあなたは

if(!(head_users)) 

をチェックしていますか?あなたのコメントはif list is empty, create the first userとなっているので、head_usersをグローバルにするか、またはtransactionに渡して、プログラムの開始時にNULLに初期化する必要があると思います。

+0

私は初期化しましたが、質問にそれをコピーするのを忘れました。 –

+0

コードに見つからないものがある場合は、エラーが存在する可能性があるため、ここに入力してください。 – Shahbaz