结构编译错误 - 取消引用指向不完整类型的指针

时间:2014-07-01 20:58:31

标签: c++ c

我正在尝试创建循环链表,并且我正在加载一些错误。 当我试图从Node内部访问Employee结构时,看起来错误正在讨论derefencing指针。

这是我得到的错误:

 magic.c: In function ‘buildList’:
magic.c:49:2: error: dereferencing pointer to incomplete type
 n->e.id = 1;
  ^
magic.c:53:4: error: dereferencing pointer to incomplete type
   n->e = e;
    ^
magic.c:54:4: error: dereferencing pointer to incomplete type
   n->d = d; 
    ^
magic.c:55:8: error: dereferencing pointer to incomplete type
   n = n->next = (ptr)malloc(sizeof(node)); 
        ^
magic.c:58:3: error: dereferencing pointer to incomplete type
  n->next = head;
   ^
magic.c:58:12: error: ‘head’ undeclared (first use in this function)
  n->next = head;
            ^
magic.c:58:12: note: each undeclared identifier is reported only once for each function it appears in
magic.c: In function ‘printList’:
magic.c:68:17: error: dereferencing pointer to incomplete type
   printf("%d", n->e.id);
                 ^
magic.c:69:8: error: dereferencing pointer to incomplete type
   n = n->next;
        ^
make: *** [magic.o] Error 1

这是我的代码:

   #include <stdio.h>
    #include <stdlib.h>

typedef unsigned int uint;

typedef struct {
    uint id;
    uint years;
    uint divion_id;
} employee;

typedef struct {
    uint id;
    char name[52];
    char manager_name[52];
    char telephone[16];
} division;

typedef struct node* ptr;

typedef struct {
    employee e;
    division d;

    ptr next;
} node;

typedef struct {
    ptr head;
} list;


list* buildList() 
{
    list *newList;
    uint i;
    employee e;
    division d;
    ptr n;

    e.id = 1;
    e.years = 5;
    e.divion_id = 1;

    newList = (list*)malloc(sizeof(list));
    newList->head = (ptr)malloc(sizeof(node));
    n = newList->head;

    for (i = 0; i < 5; ++i) {
        e.id = i+1;
        n->e = e;
        n->d = d;   
        n = n->next = (ptr)malloc(sizeof(node)); 
    }

    n->next = head;

    return newList;
}

void printList(list *lst) 
{
    ptr n = lst->head;

    do {
        printf("%d", n->e.id);
        n = n->next;
    } while (n != lst->head);
}




int main()
{
    list* lst;

    lst = buildList();
    printList(lst);
    return 0;
}

3 个答案:

答案 0 :(得分:5)

typedef的{​​{1}}您使用结构 ptr,但您没有结构,只是一个类型别名(node)。

例如。

typedef

答案 1 :(得分:0)

我认为错误的第一件事是你宣布; typedef struct node * ptr;在声明什么是节点之前,所以你必须编写typedef struct node * ptr;节点声明后..;  不是之前。

答案 2 :(得分:0)

我认为这里的问题是你有某种“不完整类型”的死锁情况 如果我们删除了ptr结构中的node成员,请执行以下操作:

typedef struct node* ptr;

typedef struct {
    employee e;
    division d;
} node;
然后一切都会好起来的。是的,ptr确实指向不完整类型struct node,但struct node定义稍后完成它。

问题是我们有这个:

typedef struct node* ptr;

typedef struct {
    employee e;
    division d;

    ptr next;
} node;

ptr指向不完整类型struct node但是当我们稍后定义struct node时,我们发现struct node本身不完整,因为它包含不完整类型的成员{{1所以它无法完成ptr