我对C有点陌生,我在uni学的,我想我可能对typedefs有些误解。这是我的代码:
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;
它工作得很好。
不幸的是,我没有看到真正的区别。
typedef struct StackNode *StackNodePtr;
不只是指向堆栈结构的指针的一种“包装类型”吗?我对指针和结构有很好的掌握,但我不知道这里发生了什么。我肯定我只是少了点小东西。顺便说一下,我正在使用gcc以c89模式编译。
最佳答案
问题是此类型定义:
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