解除链接列表中的错误 - 而不是typedef错误

时间:2014-10-13 13:16:10

标签: c pointers memory

我找不到我的解除引用错误来挽救我的生命。据我所知,我已经得到了他们需要的所有声明,无法看到我在哪里定义了一个糟糕的结构。

编辑:粘贴丢失了大量代码,但它包含了使用指针的所有代码。其他一切都是检查以确保文件是正确的文件,正确的位置,错误处理等。

typedef struct list{
int pid;
char *name;
struct list* link;
}LIST;

void begin(FILE *file, char *argv[])
{
  struct LIST *root, *p, *tail;
  struct utmp x[BUFF];
  root = NULL;
  char *name;
  int c;
  int i;
  struct utmp hold;
  int pid;
  tail = malloc(sizeof(LIST));
  int logins = 0;
  int logouts = 0;
  for (i=0;i<=BUFF;i++)
    {
      c = fread(x, sizeof(struct utmp), BUFF, file);
      if (strcmp(x[i].ut_user, argv[1]) == 0)
        {
          if (x[i].ut_type == 7)
            {
              hold = x[i];
              logins++;
              pid = x[i].ut_pid;
              name = hold.ut_user;
              p = create(pid, name); //<--Line 129 
              if (root == NULL)
                {
                root = tail = p;
                }
              else
                {
                  tail->link = p; //<---Line 136
                  tail = p;
                }
              printf("%d\n", p->pid); //<---Line 139
            }
        }
      if (x[i].ut_pid == pid && x[i].ut_type == 8)
        {
          pid = 0;
          logouts++;
        }
    }


LIST *create(int pid, char *name)
{
  LIST *p;
  p = malloc(sizeof(LIST));
  p->pid = pid;
  p->link = NULL;
  p->name = name;
  return p;
}

错误:

main.c: In function ‘begin’:
main.c:129:10: warning: assignment from incompatible pointer type [enabled by default]
main.c:136:9: error: dereferencing pointer to incomplete type
main.c:139:24: error: dereferencing pointer to incomplete type

1 个答案:

答案 0 :(得分:1)

您的问题是混淆如何使用结构和typedef。你的定义

typedef struct list{
...
}LIST;

创建2个数据类型结构struct list及其typedef等效LIST。然后,当您声明变量时,使用未定义的struct LIST。这会产生所有3个错误。编译器假设您正在其他地方定义此结构。人们使用typedef的原因是为了稍后使用struct