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;
4

2 に答える 2

2

人々はすでに答えを出しました、しかし私は提案でそれをより完全にするだろうと思いました:

混乱を最小限に抑え、正しく理解し、特定の変更があった場合のメンテナンス作業を最小限に抑えるために、常に次のmallocように使用してください。

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

この場合、typeofpointerは一度だけ言及されることに注意してください。変更された場合は、コードの残りの部分に触れる必要はありません。また、に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

于 2012-04-03T23:09:18.190 に答える
1

エラーは次の行にあるようです。

p_playlists = malloc(sizeof(playlists *));

playlist_構造体全体に十分なメモリではなく、構造体へのポインタに十分なメモリを割り当てていますplaylist_。行を次のように変更します。

p_playlists = malloc(sizeof(playlists));

構造体に十分なメモリを割り当てるplaylist_

編集以下のコメントに示されているように、ブロック内
に何かを割り当てる必要もあります。次に、プログラム内の他のエラーがなければ、機能するはずです:)curr_userselse

于 2012-04-03T23:05:35.417 に答える