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)
那是因为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;
| 归档时间: |
|
| 查看次数: |
10744 次 |
| 最近记录: |