C联合和结构问题

时间:2011-02-19 17:51:04

标签: c

我有一个树形结构。节点将具有叶节点类型和内部节点类型,因此我定义了这些结构,因此内部节点将能够指向内部节点或叶节点。但是,我在访问子指针时遇到了麻烦,我怎么能这样做,毕竟我的代码完全有意义呢?

typedef struct leaf_node_t {
    int type;
    int key;
    int *data_ptr[2]; //This will point to real data.
} leaf_node_t;

typedef struct internal_node_t {
    int type;
    int key;
    typedef union{
        struct internal_node_t* iptrs[2];
        leaf_node_t* lptrs[2];
    } node_ptr;
} internal_node_t;

3 个答案:

答案 0 :(得分:2)

试试这个:

typedef struct leaf_node_t{
       int key;
       int *data_ptr[2];//this will point to real data
} leaf_node_t;

struct internal_node_t;

typedef union{
    struct internal_node_t* iptrs[2];
    leaf_node_t* lptrs[2];
} node_ptr;

typedef struct internal_node_t{
       int key;
       node_ptr node;
} internal_node_t;

int main()
{
    internal_node_t inode;

    leaf_node_t* leaf_node = inode.node.lptrs[0];
    return 0;
}

或者,如果您实际上不需要在其他地方使用union typedef:

typedef struct leaf_node_t{
       int key;
       int *data_ptr[2];//this will point to real data
}leaf_node_t;

typedef struct internal_node_t{
       int key;
       union{
             struct internal_node_t* iptrs[2];
             leaf_node_t* lptrs[2];
       }node_ptr;
}internal_node_t;
int main()
{
    internal_node_t inode;

    leaf_node_t* leaf_node = inode.node_ptr.lptrs[0];
    return 0;
}

答案 1 :(得分:2)

node_ptr的typedef实际上并没有向其封闭结构添加字段。下面首先添加字段,然后使用typedef进行跟进。我做的另一个改变是让union表示一个指针,将它留给使用它来决定它想要多少指针的结构。

typedef struct internal_node_t{
   int type;
   int key;
   union node_ptr_t {
         struct internal_node_t* iptr;
         leaf_node_t* lptr;
   } node_ptr[2];
}internal_node_t;

typedef union node_ptr_t node_ptr_t;

答案 2 :(得分:1)

您应该在internal_node中添加一个标志,以了解node_ptr是什么,如果它是internal_node_t或leaf_node_t。可能是int isInternal [2]; (在键之后和typedef之前)。如果它是0,那么它是内部的,如果它是1那么它是leaf_node_t。 C语言没有typeof或GetType来知道指针指向什么类型的内存(只有当你使用RTTI“选项”激活时,C ++才会使用它)