我对C有些新手,我在大学学习它,我想我可能会误解有关typedef的东西。这是我的代码:
struct stackNode
{
char data;
struct stackNode *nextPtr;
};
typedef struct stackNode StackNode;
typedef struct StackNode *StackNodePtr;
int main()
{
StackNode stack;
StackNodePtr stackPtr = &stack;
}
这给了我这个警告:
warning: initialization from incompatible pointer type [enabled by default]
StackNodePtr stackPtr = &stack;
^
但是,如果我用这个替换该行:
StackNode *stackPtr = &stack;
工作正常。
不幸的是,我没有看到真正的区别。对于指向Stack结构的指针,typedef struct StackNode *StackNodePtr;
只是一种“包装类型”吗?我对指针和结构有很好的把握,但我不知道这里发生了什么。我确定我只是错过了一些小事。
顺便说一下,我正在使用gcc在c89模式下编译。
答案 0 :(得分:3)
问题在于此类型定义:
typedef struct StackNode *StackNodePtr;
没有struct StackNode
。仅存在struct stackNode
和StackNode
。因此,您需要使用typedef中的任何一个。
但更好的解决方案是不要隐藏typedef背后的指针:
const
和volatile
)效果更佳。如果您定义StackNodePtr
,则可能还必须定义ConstStackNodePtr
,VolatileStackNodePtr
和ConstVolatileStackNodePtr
。所以,摆脱StackNodePtr
并简单地使用你已经尝试过的方法:
StackNode *stackPtr = &stack; // stackPtr is clearly a pointer
答案 1 :(得分:0)
“stackNode”在
中拼写错误if else
(大写“S”)。