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

u14*_*796 1 arrays gcc struct pointers typedef

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

typedef struct _node node;
struct _node{
 int foo;
 node (*children)[2];
 int bar;
};
Run Code Online (Sandbox Code Playgroud)

在内存中,结构应该如下所示

0x345345000000 foo
0x345345000004 pointer to 1. child node
0x345345000008 pointer to 2. child node
0x34534500000C bar
Run Code Online (Sandbox Code Playgroud)

Tho*_*nin 7

那是因为C类型表达式反过来.

这个:

node (*children)[2];
Run Code Online (Sandbox Code Playgroud)

读取如下:children当取消引用(*应用于它们)时,产生[]可以应用数组运算符的东西,产生a node.这意味着它children是指向两个数组的指针node.但是,您不希望指向数组的指针,您需要一个包含两个指针的数组.为此,你应该把括号放在:

node *(children[2]);
Run Code Online (Sandbox Code Playgroud)

然后读作:内容children是两个值的数组; 申请*其中一个产生一个node.这就是你想要的:一个由两个指针组成的数组node.请注意,这相当于:

node *children[2];
Run Code Online (Sandbox Code Playgroud)

因为在C语法中,当涉及到类型表达式时,[]运算符优先于*运算符.

在你的初始版本中,C编译器抱怨,因为在它读取声明时,它不知道大小node是什么(结构定义还没有完成),因此,很难想象一个类型"两个数组node" .这是问题的一个相当间接的症状.

附注:您应该避免_node在代码中使用以下划线开头的任何其他标识符.这些标识符保留用于"实现".在实践中,系统标头可能会使用它们,并且碰撞可能会有害.就个人而言,我倾向于在最后添加下划线,如下所示:typedef struct node_ node;