取消引用指向不完整类型的指针

时间:2015-06-14 13:42:08

标签: c

我是C编程的新手,作为一个迷你项目,我决定尝试使用文件GenericStack.h中的OOP样式结构在C中实现堆栈,如下所示:

void _GENERICSTACK0001(void *,void *);
void *_GENERICSTACK0002(void *);
int _GENERICSTACK0003(void *);

typedef struct 
{
   struct GenericStackNode *next;
   void *data;
   int type;
}GenericStackNode;

typedef struct 
{
    struct GenericStackNode *top;
    int count;
    void (*add)(void *,void *);
    void *(*pop)(void *);
    int (*hasNext)(void *);
    int (*getCount)(void *);
}GenericStack;

GenericStack newGenericStack()
{
    GenericStack *genStack = malloc(sizeof(GenericStack));
    genStack->add = _GENERICSTACK0001;
    genStack->pop = _GENERICSTACK0002;
    genStack->hasNext = _GENERICSTACK0003;
    genStack->getCount = _GENERICSTACK0003;
    genStack->top=NULL;
    genStack->count = 0;
    return *genStack;
}

void _GENERICSTACK0001(void *self,void *data)//add
{
    GenericStack *genStack = self;
    if(genStack->top  == NULL)
    {
        genStack->top = malloc(sizeof(GenericStackNode));
        genStack->top->next = NULL;
        genStack->top->type = 0;
        genStack->top->data = data;
    }
    else
    {
        GenericStackNode *temp = malloc(sizeof(GenericStackNode));
        temp->next = genStack->top;
        temp->type = 0;
        temp->data = data;
        genStack->top = temp;
        genStack->count++;
    }
}

void *_GENERICSTACK0002(void *self)//pop
{
    GenericStack *genStack = self;
    void *data = NULL;
    if(genStack->top  == NULL)
    {
        return data;
    }
    else
    {
        GenericStackNode *temp = genStack->top;
        genStack->top = genStack->top->next;
        data = temp->data;
        free(temp);
        genStack->count--;
        return data;
    }
}

int _GENERICSTACK0003(void *self)
{
    GenericStack *genStack = self;
    return genStack->count;
}

我需要知道的是为什么(和许多其他人一样)我得到了具体的错误:

GenericStack.h:41:16: error: dereferencing pointer to incomplete type
   genStack->top->type = 0; 

我已经检查了stackoverflow上有关“取消引用指向不完整类型的指针”的其他答案,但我似乎无法理解。

2 个答案:

答案 0 :(得分:1)

您从GenericStack收到错误,但GenericStackGenericStackNode都有问题。

在C中,struct XX是不同的类型。当你写:

struct GenericStackNode *next;

它声明了一个名为struct GenericStackNode的类型(以及一个指向该类型的指针的成员)。此类型不完整,因为您尚未提供结构定义。

可以通过稍后提供结构定义来完成类型,但是你永远不会这样做。相反,您可以为其定义一个未命名的struct和typedef GenericStackNode,但这对struct GenericStackNode没有影响。

然后,struct GenericStackNode *top;仍然使用相同的不完整类型,而不是上面定义的结构。

假设你的意思是指针指向它所包含的相同类型结构的指针,你可以将这个模式用于你的两个结构:

typedef struct X X;

struct X
{
    X *ptr;
};

人们常常将typedef与struct定义结合起来,但我发现将它们分开是更清楚的。

答案 1 :(得分:0)

您已将类型定义为GenericStackNode作为类型,不再需要struct GenericStackNode,只需GenericStackNode

typedef struct 
{
    struct GenericStackNode *top;
...
}

应该只是

typedef struct 
{
    GenericStackNode *top;
...
}

另外,当你还没有定义它时,你不能使用GenericStackNode

typedef struct 
{
   struct GenericStackNode *next;
   void *data;
   int type;
} GenericStackNode ;

你可以写:

typedef struct GenericStackNode 
{
   struct GenericStackNode *next;
   void *data;
   int type;
} GenericStackNode ;