【问题标题】:How to cascade -> operator?如何级联-> 运算符?
【发布时间】:2015-07-29 01:45:35
【问题描述】:

我有以下:

typedef struct Node_struct
{
    int number;
    Node *nextNode;
    Node *prevNode;
} Node;

以后

Node *nodeInSet = lookup(set, number);
nodeInSet->nextNode = (Node *) malloc(sizeof(Node));
nodeInSet->nextNode->prevNode

最后一行是说:“表达式必须具有指向类的类型”。我看不出我的代码有什么问题。由于nodeInSet->nextNodeNode *,我想我应该被允许写nodeInSet->nextNode->prevNode。什么在这里不工作?

【问题讨论】:

  • 我还怀疑您使用了错误的编译器,否则Do not cast the return value from malloc()。你可以这样写,但你真的不应该。从示例代码中无法说明为什么会发生错误,您可以发布可重现的示例吗?另外,nodeInSet->nextNode->prevNode 不是nodeInSet 吗?如果列表被正确填充。
  • Node_struct 内部,typedef Node 还没有定义,所以你应该声明struct Node_struct *nextNode
  • 一个结构定义不应该是 typedef'd。 typedef'ing 使代码混乱,导致误解,不增加任何价值,并使编译器名称空间混乱。而是总是使用:'struct Node_struct'

标签: c pointers dereference


【解决方案1】:

prevNodenextNode 成员类型不完整,必须这样写

typedef struct Node_struct
{
    int number;
    struct Node_struct *nextNode;
    struct Node_struct *prevNode;
} Node;

typedef struct Node_struct Node;
struct Node_struct
{
    int number;
    Node *nextNode;
    Node *prevNode;
};

原因是您可以将指针声明为不完整的类型,但是如果您尝试取消引用指针,例如使用-> 运算符时,则必须知道类型,因为类型的大小是需要。

【讨论】:

    【解决方案2】:

    你可以把你的代码改成这个。

    typedef struct Node_struct
    {
        int number;
        struct Node_struct *nextNode;
        struct Node_struct *prevNode;
    } Node;
    

    【讨论】:

    • 这不是可选的,你可以改变......听起来好像是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2020-08-24
    相关资源
    最近更新 更多