我已经习惯了像下面这样的代码很长一段时间。
但是C编译器如何解决循环定义问题呢?或者这个问题真的存在吗?
struct node {
int data;
struct node *next; // circular definition for "struct node" type?
};
ADD 1
或者,在 32 位机器上,我可以稍微处理一下吗struct node * next
成员只是作为 32 位无符号整数类型的成员吗?这让我感觉好多了。
ADD 2
我想到循环定义的原因是,当编译器遇到类似的情况时next -> data
or next -> next
,它必须知道确切的offset每个成员添加到next
获取每个成员的正确位置的指针。这种计算需要了解每个成员的情况type。那么对于会员来说next
,可能会出现循环定义问题:
的类型next
is struct node *
, the struct node
类型
包含一个next
,类型next
is struct node *
...
ADD 3
编译器是如何计算的sizeof(struct node)
?
ADD 4
嗯,我认为理解这个看似循环问题的关键概念是,指针的大小与其指向的类型无关。尺寸是fixed在特定机器上。指针的类型是only在编译时对于编译器生成指针计算指令有意义。
next
is a struct node *
,这只是一个指针,而不是struct node
,所以没有实际的循环定义。不需要了解结构的详细信息即可确定如何创建指向它的指针。
要解决您的附录:
- 尽管这或多或少是准确的并且可能会起作用,但标准并不能保证它,因此您不应该这样做。
- Again,
struct node
and struct node *
是完全不同的类型。 Astruct node *
不包含任何其他对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)