我对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 stackNodeStackNode存在。所以你需要使用typedef中的任何一个。
但更好的解决方案是根本不要在typedef后面隐藏指针:
它使指针更清晰可见。
它可以更好地处理类型限定符,例如constvolatile。如果定义StackNodePtr,则可能还必须定义ConstStackNodePtrVolatileStackNodePtrConstVolatileStackNodePtr
所以,去掉StackNodePtr并简单地使用您已经尝试过的方法:
StackNode *stackPtr = &stack;  // stackPtr is clearly a pointer

07-24 09:46
查看更多