Как указать одну структуру на другую - PullRequest
1 голос
/ 03 апреля 2012

Мне нужна помощь, указывая *user_playlist на узел списка воспроизведения. Как я могу это сделать?

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

struct users_ {
  int user_ID;
  playlists *user_playlist;
  struct users_ *next;
};
typedef struct users_ users;

p_users = (users *)malloc(sizeof(users *));
p_users -> user_ID = account_number;
head_users = p_users;
head_users -> next = NULL;
users_pointer = head_users;

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

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

1 Ответ

4 голосов
/ 03 апреля 2012

Это проблема:

p_users = (users *)malloc(sizeof(users *));

он только распределяет размер указателя, а не размер users структуры. Изменить на:

p_users = malloc(sizeof(users));

или

p_users = malloc(sizeof(*p_users));

Приведение возвращаемого значения malloc() не является необходимым и потенциально опасным.

EDIT:

Разыменование указателя, унифицированного или NULL, вызовет ошибку сегментации. Это объявляет , но не инициализирует curr_users (то же самое для других перечисленных переменных):

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

Затем делается попытка доступа к curr_users:

curr_users->user_playlist = curr_playlists; /* Segmentation fault. */

Инициализируйте curr_users перед использованием либо в действительную структуру users, либо в NULL и проверьте на ненулевое значение, прежде чем ссылаться:

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

if (curr_users)
{
    curr_users->user_playlist = curr_playlists;
}
...