GCC:数组类型有不完整的元素类型?

时间:2010-02-16 16:44:35

标签: arrays gcc pointers struct typedef

当我尝试编译它时,GCC给了我一个“数组类型有不完整的元素类型”-error消息:

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

2 个答案:

答案 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];