【问题标题】:How to point one structure to another如何将一个结构指向另一个结构
【发布时间】:2012-04-03 11:27:12
【问题描述】:

我需要帮助将*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;

【问题讨论】:

  • 我在某处遇到总线错误(核心转储)
  • 我认为你需要写 malloc(sizeof(users)) 而不是 malloc(sizeof(users*))。 'sizeof(users*)' 表示指向'users'的指针的大小,当你需要'users'的大小时。
  • @BinyaminSharet 当我在 gdb 上运行它时,我在这里curr_users -> user_playlist = curr_playlists;

标签: c pointers linked-list structure


【解决方案1】:

这是个问题:

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

它只分配指针的大小,而不是users 结构的大小。改为:

p_users = malloc(sizeof(users));

或:

p_users = malloc(sizeof(*p_users));

Casting the return value of malloc() is unnecessary and potentially dangerous.

编辑:

取消引用未初始化的或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;
}

【讨论】:

  • 更不用说p_users = malloc(sizeof(*p_users)); 可以完全解决问题。
  • 我进行了更改,但仍然收到错误 curr_users -> user_playlist = curr_playlists; 的分段错误
  • @LearningC,我看不到 curr_users 的初始化位置?
  • 我刚刚在问题末尾添加了。
  • 这只是声明,而不是初始化。如果使用 curr_users 而不修改该声明,则会导致分段错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 2023-03-16
  • 2018-04-25
  • 2016-09-24
相关资源
最近更新 更多