简体   繁体   中英

Dereferencing pointer to incomplete type

I am new to C programming and as a mini project I decided to try to implement a stack in C using OOP style structure in a file GenericStack.h as shown below:

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;
}

All I need to know is why (among many others) I get the specific error:

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

I have checked the other answers on stackoverflow concerning "dereferencing pointer to incomplete type" but I cant seem to understand.

You're getting an error from GenericStack , but you have a problem in both GenericStack and GenericStackNode .

In C, struct X and X are different types. When you write:

struct GenericStackNode *next;

it declares a type called struct GenericStackNode (and a member which is a pointer to that type). This type is incomplete because you have not provided the struct definition.

The type could be completed by providing a struct definition later, but you never do that. Instead, you define an unnamed struct and typedef GenericStackNode to it , but that has no effect on struct GenericStackNode .

Then, struct GenericStackNode *top; still uses this same incomplete type, not the struct you defined above.

Assuming you meant for this pointer to be a pointer to the same type of struct it's contained in, you could use this pattern for both of your structs:

typedef struct X X;

struct X
{
    X *ptr;
};

Often people combine the typedef with the struct definition but I find it clearer to have them separate.

You already type-defined GenericStackNode as a type, there is no need for struct GenericStackNode anymore, just GenericStackNode :

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

should be only

typedef struct 
{
    GenericStackNode *top;
...
}

also , you can't use GenericStackNode when you still havn't defined it yet :

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

you can write :

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM