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

时间:2016-04-27 15:36:31

标签: c pointers struct gcc-warning

我对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模式下编译。

2 个答案:

答案 0 :(得分:3)

问题在于此类型定义:

typedef struct StackNode *StackNodePtr;

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

但更好的解决方案是不要隐藏typedef背后的指针:

  1. 它使指针更清晰可见。
  2. 使用类型限定符(例如constvolatile)效果更佳。如果您定义StackNodePtr,则可能还必须定义ConstStackNodePtrVolatileStackNodePtrConstVolatileStackNodePtr
  3. 所以,摆脱StackNodePtr并简单地使用你已经尝试过的方法:

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

答案 1 :(得分:0)

“stackNode”在

中拼写错误
if else

(大写“S”)。