无法将结构的地址分配给类型为指向该结构的指针的 typedef 的变量

Can't assign address of struct to a variable whose type is a typedef of pointer to that struct

我对 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;

它工作正常。

不幸的是,我在这里没有看到真正的区别。 typedef struct StackNode *StackNodePtr; 不只是一种指向 Stack 结构的指针的 "wrapper type" 吗?我已经很好地掌握了指针和结构,但我不知道这里发生了什么。我确定我只是遗漏了一些小东西。

顺便说一下,我正在使用 gcc 在 c89 模式下编译。

问题是这个类型定义:

typedef struct StackNode *StackNodePtr;

没有struct StackNode。只有 struct stackNodeStackNode 存在。因此,您需要使用 typedef 中的其中一个。

但更好的解决方案是完全不将指针隐藏在 typedef 后面:

  1. 使指针更清晰可见。
  2. 它与类型限定符一起使用效果更好,例如 constvolatile。如果定义 StackNodePtr,则可能还必须定义 ConstStackNodePtrVolatileStackNodePtrConstVolatileStackNodePtr

所以,去掉 StackNodePtr 并简单地使用您已经尝试过的方法:

StackNode *stackPtr = &stack;  // stackPtr is clearly a pointer

"stackNode" 拼写错误

typedef struct StackNode *StackNodePtr;

(大写 "S").