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

标签 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;

它工作正常。

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

顺便说一下,我正在使用 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

关于无法将结构的地址分配给类型为指向该结构的指针的 typedef 的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36894472/

相关文章:

c - 使用多个 .h 文件时在哪里进行 typedef

c - Gradle:如何为 C/C++ 目标文件指定输出目录?

c - 关于矩阵的指针算术的指针

c - 如何初始化char指针以便在C中经常使用它?

使用 memcpy 将动态结构数组的内容复制到另一个动态数组中

c - 查找代码的内存访问冲突

c - 多线程,每个线程都有唯一的变量

c - 如何在 C 中将文件中的整数 fscanf 到数组中?

c - 在结构中分配给 char* 时出现段错误

c - 在 C 的结构中的哪里放置嵌套 union ?