typedef struct _node node;
struct _node{
int foo;
node (*children)[2];
int bar;
};
在内存中,结构应该如下所示
0x345345000000 foo
0x345345000004 pointer to 1. child node
0x345345000008 pointer to 2. child node
0x34534500000C bar
答案 0 :(得分:7)
那是因为C类型表达式反过来。
此:
node (*children)[2];
如下所示:children
的内容,当取消引用时(*
应用于它们),产生一些可以应用数组运算符[]
的东西,产生一个{ {1}}。这意味着node
是指向两个children
数组的指针。但是,您不希望指向数组的指针,您需要一个包含两个指针的数组。为此,你应该把括号括起来:
node
然后读作:node *(children[2]);
的内容是两个值的数组;在其中一个上应用children
会产生*
。这就是你想要的:一个指向node
的两个指针的数组。请注意,这相当于:
node
因为在C语法中,当涉及到类型表达式时,node *children[2];
运算符优先于[]
运算符。
在您的初始版本中,C编译器抱怨,因为在它读取声明时,它不知道大小*
是什么(结构定义尚未完成),因此,有麻烦想象一个类型“两个node
的数组”。这是问题的一个相当间接的症状。
附注:您应该避免在代码中使用node
或以下划线开头的任何其他标识符。这些标识符保留用于“实现”。在实践中,系统标头可能会使用它们,并且碰撞可能会有害。就个人而言,我倾向于在 end 添加下划线,如下所示:_node
答案 1 :(得分:2)
而不是:
node (*children)[2];
使用此:
struct _node* children[2];