我对 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 结构的指针的“包装类型”吗?我已经很好地掌握了指针和结构,但我不知道这里发生了什么。我确定我只是遗漏了一些小东西。
顺便说一下,我正在使用 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
关于无法将结构的地址分配给类型为指向该结构的指针的 typedef 的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36894472/