2014-02-07 80 views
1

所以我有一个结构如下:阵列结构指针作为结构的第一要素

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替换所有parent->child s,因为它们指向相同的地址,我觉得不需要额外的内存访问。但是当我这样做时,我得到一个错误,我试图将一个tree分配给tree*

我怎么能这样做,还有什么其他的优化,我可以做得更快?

+0

领先*是没有必要的,因为有我希望父母已经是尖的。你不想取消引用它的内容,你想把p指向父+索引中的地址。 –

回答

2

如果明白的问题,你想与父 - >子的另一实例与

tree* p = *(parent + index); 

,同样更换

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

为了通过减少内存访问来优化你的程序。

代码原样没有冗余存储器访问。

parent->child 

parent 

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

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

+0

谢谢。但出于好奇,如果我想要做这样的事情,我会怎么做呢? –

+0

对不起,我不明白。如果你想做一些像什么一样的事情? –

+1

@vitakraft你不知道。父母和孩子没有相同的类型,并且指针算术需要正确的类型(因为像'+ child'这样的操作会移动子对象_的数量,而不是_bytes_的数量。 – tabstop

0

我有这评论,但它是太难正确格式化文本...

你有什么现在看起来不错,但你真的不表明你试图这样做。例如,你是否说过你试过这个:

tree *p = parent + index; 

这是什么回报错误?如果是这样,你声明父是

struct tree parent; 

struct tree *parent; 

您需要将其声明为第二。

+0

'tree * p = *(parent + index);'对我来说听起来不错,但没有建立。我也试过你的,它建立但不起作用。我在参数中将'parent'定义为'tree *'。 –

+0

在这一点上,我建议你或者通过引用成员来完成它,或者使用void *遍历结构并将每个值作为十六进制值打印出来。您可能会在编译器中发生某些事情,因为正在分配数组或其他值。 –

0

你应该尝试:

tree* p = parent + index; 
+0

这是行不通的,我不需要指针地址,我需要地址指向的对象。 –