Suppose I have the following structure
typedef struct _Stack {
struct _Stack *next;
} Stack;
Note in above there is no data type for storage, only *next pointer to structure. So, my question is will it be possible that the following function is valid.
void stackPush(Stack **stackP, void *dataP) {
Stack *data = (Stack*)dataP;
data->next = *stackP;
*stackP = data;
}
I saw this function in glib library in the file gtrashstack.c. But when I compiled above, I got a warning : In data->next : assignment from incompatible pointer type.
I know that, I can rewrite the structure with generic pointer. But I only want to know, why the above will not work?
Update: My mistake, here I write typedef struct _Stack but in my program, I missed _Stack.
This function is valid. Probably it is used for different structures like:
typedef struct my_Stack {
struct my_Stack *next;
sometype1 somename1;
...
sometypen somenamen;
} MyStack;
i.e. for the lists where the pointer to the next elem is placed as the first field of the structure. It is the same trick as when classes are built via simple inheritance in C++. For such a structure you can call:
x = malloc(sizeof(struct my_Stack));
x->somename1 = aaa; ...
stackPush(&mylist, x);
I am not sure if this style of programming is supported by the C standard. It's not a good style for novices. It is for developers who know what they are doing in C.
The answer is yes, it is possible to implement stack with only pointer to structure (no data type). See implementation of generic list or queue in c in Linux (don't know if it is implemented in windows also). See how it is implemented Linux Kernel Linked List Explained
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With