假设我有以下结构
typedef struct _Stack {
struct _Stack *next;
} Stack;
请注意,上面没有用于存储的数据类型,只有*next
指向结构的指针。所以,我的问题是以下函数是否有效。
void stackPush(Stack **stackP, void *dataP) {
Stack *data = (Stack*)dataP;
data->next = *stackP;
*stackP = data;
}
我在文件glib
的{{1}}库中看到了这个函数。但是当我在上面编译时,我收到了警告:gtrashstack.c
。
我知道,我可以用通用指针重写结构。但我只想知道,为什么以上不起作用?
更新:我的错误,我在这里写In data->next : assignment from incompatible pointer type
,但在我的计划中,我错过了typedef struct _Stack
。
答案 0 :(得分:2)
此功能有效。可能它用于不同的结构,如:
typedef struct my_Stack {
struct my_Stack *next;
sometype1 somename1;
...
sometypen somenamen;
} MyStack;
即。对于将指向下一个elem的指针放置为结构的第一个字段的列表。这与通过C ++中的简单继承构建类时的技巧相同。对于这样的结构,您可以致电:
x = malloc(sizeof(struct my_Stack));
x->somename1 = aaa; ...
stackPush(&mylist, x);
我不确定C标准是否支持这种编程风格。这对初学者来说不是一个好习惯。它适用于那些知道他们在C中做什么的开发人员。
答案 1 :(得分:1)
答案是肯定的,有可能只用指向结构的指针(没有数据类型)来实现堆栈。请参阅Linux中c中通用列表或队列的实现(不知道它是否也在windows中实现)。了解它的实施方式Linux Kernel Linked List Explained