typedef的用途是什么,其正确用途是什么?

时间:2019-11-15 09:36:04

标签: c data-structures typedef

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

    typedef struct
    {
       int val;
       struct tree *left, *right;
    }tree;

    struct tree *root;

    struct tree *add_vertex(int val) 
    {
      struct tree *root = malloc(sizeof(struct tree*));
      root->val = val;
      root->left = NULL;
      root->right = NULL;
      return root;
    }

    void print_tree(struct tree *root)
    {
      printf("%d\n", root->val);
      if(root->left == NULL)
       return;
      else
       print_tree(root->left);
      if(root->right == NULL)
        return;
      else
        print_tree(root->right);
    } 

    int main() {
      struct tree *root = NULL;

        root = add_vertex(1);
        root->left = add_vertex(2);
        root->right = add_vertex(3);
        root->left->left = add_vertex(4);
        root->left->right = add_vertex(5);
        root->right->left = add_vertex(6);
        root->right->right = add_vertex(7);

        print_tree(root);   

        return 0;
     }

这段代码正在生成

prog.c: In function 'add_vertex':
prog.c:15:9: error: dereferencing pointer to incomplete type 'struct tree'
     root->val = val;
         ^'

删除typedef并进行特定更改会很好。

1 个答案:

答案 0 :(得分:0)

问题是

typedef struct
{
   int val;
   struct tree *left, *right;
}tree;

定义了一个名为tree类型,它是未命名结构的类型。

您的代码中没有定义struct tree

如果删除typedef,将定义一个名为tree的结构,并且代码将正常工作。


也就是说,如果您想使用typedef,可以做类似的事情

struct tree
{
   int val;
   struct tree *left, *right;
};

typedef struct tree tree;

//......

tree *add_vertex(int val)  //no need to use struct keyword anymore
    {
      tree *root = malloc(sizeof(*root));
      root->val = val;
      root->left = NULL;
      root->right = NULL;
      return root;
    }