结构指针数组作为struct的第一个元素

时间:2014-02-07 01:21:39

标签: c arrays pointers tree

所以我的结构如下:

typedef struct tree tree;

struct tree {
    tree* child[10];
    int value;
};

以及添加子项并返回其地址的函数,如下所示:

tree* tree_add_child(tree* parent, int index)
{
    tree* p = *(parent->child + index);

    if (p == NULL)
    {
          p = tree_new_tree(); //malloc new tree - init it - return its address
          *(parent->child + index) = p;
    }
    return p;
}

它按照我想要的方式工作。但我想用parent->child替换所有parent s,因为它们指向同一个地址,我觉得不需要额外的内存访问。但是,当我这样做时,我收到一个错误,我正在尝试将tree分配给tree*

我怎么能这样做,是否还有其他任何可以让它运行得更快的优化?

3 个答案:

答案 0 :(得分:2)

如果您了解问题,则需要替换

tree* p = *(parent->child + index);

tree* p = *(parent + index);

以及parent-> child的另一个实例,以便通过减少内存访问来优化您的程序。

代码中没有冗余的内存访问。

parent->child

parent

do 具有相同的地址,编译器知道这一点。它不必查看内存以找出子项的相对地址来自父项。它知道偏移量(在这种情况下为零)。它不像结构包含每个成员的偏移表;他们在编译时就知道了。这是为了使用其成员必须知道结构的完整定义(而不仅仅是通过前向声明的名称)的部分原因。

即使是这种情况,您也不能将碰巧解析的所有表达式替换为相同的地址。类型安全是为了保护您免受这种替换的微妙错误,并确保您只将“tree *”值分配给“tree *”变量(等等),编译器正在帮助您防止错误。 / p>

答案 1 :(得分:0)

我在评论中有这个,但要正确格式化文本太难了......

你现在看起来还不错,但你并没有真正展示你想要做的事情。例如,你是说你试过这个:

tree *p = parent + index;

这是返回错误的原因吗?如果是这样,你是否宣布父母是

struct tree parent;

struct tree *parent;  

您需要将其声明为第二个。

答案 2 :(得分:0)

你应该尝试:

tree* p = parent + index;