【问题标题】:Pointers to Structure in C指向 C 中的结构的指针
【发布时间】:2011-02-06 11:23:25
【问题描述】:

这段代码有什么错误?为什么我不能以我尝试的方式取消引用元素。

#include<stdio.h>
typedef struct
{
    int value;
    struct node * left;
    struct node * right;
} node;

int main() {
    node* root,*temp;
    root = (node*) malloc(sizeof(node));
    root->value = 10;
    (root->left)= (node*) malloc(sizeof(node));
    (root->right)=(node*) malloc(sizeof(node));
    ((root->left)->value) =20;   // WHY AN ERROR HERE???
}   

【问题讨论】:

  • 不要对结构进行 typedef。它已经有一个类型作为结构 - 你所做的只是让你的代码更复杂。
  • @Felice Pollano 除了一大堆警告:错误:取消引用指向不完整类型的指针
  • @Blank Xavier 嗯,typedef 允许你在使用时省略结构体,这样可以使代码更易于阅读。
  • @Phihag:它隐藏了底层类型。当且仅当对类型的所有操作都通过函数发生时,这正是您想要的。在这种情况下,由于它是一个结构,并且我们将它用作结构(例如“->”),那么我们需要知道它是一个结构,所以隐藏它的类型是没有用的。它给读者带来了额外的负担,他们必须记住我们拥有的每个 typedef 的底层类型,而这些类型不是仅限函数操作的。
  • @Blank Xavier:我理解您的考虑,但正如@phihag 所说,更易读的代码也非常方便。此外,我们使用 -> 就足以知道它是一个结构......

标签: c pointers data-structures


【解决方案1】:

您的结构定义错过了您进一步重用的类型名。当你声明左右字段时,编译器不知道结构节点是什么。您需要声明您的结构是一个节点。这意味着要更改 typedef 别名。看后面的更正,这编译得很好:

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
        int value;
        struct node * left;
        struct node * right;
} Node;

int main() {
        Node* root,*temp;
        root = (Node*) malloc(sizeof(Node));
        root->value = 10;
        (root->left)= (Node*) malloc(sizeof(Node));
        (root->right)=(Node*) malloc(sizeof(Node));
        ((root->left)->value) =20;   /* no more errors */

        return 0;
}

【讨论】:

  • 仍然表示解引用指针指向不完整类型
  • @user420878 请确保您使用的正是此代码。在这里用 gcc 4.3.2 编译得很好。请注意,jHackTheRipper 将您的类型名称从节点更改为节点。相反,您可能希望将 struct node 替换为 struct node_its_a_struct 左右
  • 奇怪...你用的是哪个编译器?它在 MacOS X (gcc 4.2.1) 和 Linux CentOS (gcc 4.1.2) 上编译得很好,带有严格的标志:gcc -Wall -Wextra -ansi -pedantic -posix foo.c
  • @user420878:当有人解决了您的问题时,您应该通过单击答案投票下方的勾号来接受他们的回答。你已经在这个网站上问了 10 个问题,并且从未奖励任何用户为他们提供帮助的时间。此外,您现在对upvote answers 有足够的声誉,表明帖子很有趣。我鼓励您回到您之前提出的问题,并为对您有帮助的答案投票;更一般地说,我鼓励你阅读the stackoverflow faq
【解决方案2】:

首先,让我建议打开所有警告。你会看到第一个问题是分配root-&gt;left。您不能在结构定义中引用由 typedef 建立的名称。相反,Use the struct name,像这样:

typedef struct node_t {
    int value;
    struct node_t * left;
    struct node_t * right;
} node;

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多