问题更多是基于理论而非实际实现。
我想知道的是,在代码中:
struct temp {
int num;
struct temp *next;
};
在上述结构中,当实例化内存时,编译器如何决定应在内存中分配多少空间?
如果我尝试空运行代码,则整数的大小将为2或4个字节,此后,如果尝试查找指向结构本身的指针的大小,则输入包含另一个整数的结构以及指向自身的指针。
根据这种逻辑,编译器在决定为该结构的元素分配空间时会进入无限循环,那么如何确定空间?
P.S。我确实尝试自己找出此结构的大小(使用sizeof()
运算符,结果是16个字节(整数的大小为4个字节)...我想知道如何做它将这个16字节的数字确定为所需的空间!
答案 0 :(得分:6)
包含指向自身的指针的结构不是问题。
指针的大小是固定的,因此指针指向的结构大小无关紧要。在大多数系统上,您可能会碰到一个指针,大小为4个字节或8个字节。
对于您给出的struct
,int
字段将使用4个字节,而struct temp *
字段将使用8个字节。这意味着该结构的大小将至少为12个字节,由于填充的正确对齐,可能为16个字节。
另一方面,如果您有类似的内容:
struct temp {
int num;
struct temp next;
};
这是不合法的,因为该结构包含自身的副本,而该副本又包含其自身的副本,依此类推。
答案 1 :(得分:2)
在上述结构中,当实例化内存时,编译器如何决定应在内存中分配多少空间?
指针类型占据固定大小,这与指向类型无关(IOW,struct temp *
的大小和表示形式与{{1} }。此外,所有指向struct temp
类型的指针都具有相同的大小:
6.2.5类型
...
28指向struct
的指针应具有与 指向字符类型的指针。 48)同样,指向合格或不合格版本的字符的指针。 兼容类型应具有相同的表示和对齐要求。 全部 结构类型的指针应具有相同的表示和对齐要求 。所有指向联合类型的指针都应具有相同的表示形式,并且 彼此之间的对齐要求。指向其他类型的指针不必相同 表示或对齐要求。
在x86之类的平台上, all 指针类型具有相同的大小和表示形式,但是该标准必须考虑奇数球体系结构。
这与您拥有指向void
的指针或指向int
的成员的指针没有什么不同。唯一使它看起来很奇怪的是,您正在创建一个自引用指针,该指针是允许的:
6.7.2.1结构和联合说明符
...
3结构或联合不得包含具有不完整或功能类型的成员(因此, 结构不应包含其自身的实例,但可以包含指向该实例的指针 ),但结构的最后一个成员具有多个命名成员 可能具有不完整的数组类型;这样的结构(以及可能包含 递归地,这种结构的成员)不应是该结构的成员或 数组的元素。
同上。
即使结构类型本身在定义的void
结束之前是不完整的,但指向它的任何 pointer 都是完整的(也就是说,其大小是已知的)。
指向类型的大小对于指针算术很重要(即,}
产生的地址值将取决于p + 1
所指向的东西的大小)。但是,存储指针本身并不重要。