C / C ++:结构如何包含指向自身的指针?

时间:2018-12-03 17:39:25

标签: c++ c

问题更多是基于理论而非实际实现。

我想知道的是,在代码中:

struct temp {
    int num;
    struct temp *next;
};

在上述结构中,当实例化内存时,编译器如何决定应在内存中分配多少空间?

如果我尝试空运行代码,则整数的大小将为2或4个字节,此后,如果尝试查找指向结构本身的指针的大小,则输入包含另一个整数的结构以及指向自身的指针。

根据这种逻辑,编译器在决定为该结构的元素分配空间时会进入无限循环,那么如何确定空间?

P.S。我确实尝试自己找出此结构的大小(使用sizeof()运算符,结果是16个字节(整数的大小为4个字节)...我想知道如何做它将这个16字节的数字确定为所需的空间!

2 个答案:

答案 0 :(得分:6)

包含指向自身的指针的结构不是问题。

指针的大小是固定的,因此指针指向的结构大小无关紧要。在大多数系统上,您可能会碰到一个指针,大小为4个字节或8个字节。

对于您给出的structint字段将使用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)同样,指向合格或不合格版本的字符的指针。 兼容类型应具有相同的表示和对齐要求。 全部 结构类型的指针应具有相同的表示和对齐要求 。所有指向联合类型的指针都应具有相同的表示形式,并且 彼此之间的对齐要求。指向其他类型的指针不必相同 表示或对齐要求。

C 2011 online draft

在x86之类的平台上, all 指针类型具有相同的大小和表示形式,但是该标准必须考虑奇数球体系结构。

这与您拥有指向void的指针或指向int的成员的指针没有什么不同。唯一使它看起来很奇怪的是,您正在创建一个自引用指针,该指针是允许的:

6.7.2.1结构和联合说明符
...
3结构或联合不得包含具有不完整或功能类型的成员(因此, 结构不应包含其自身的实例,但可以包含指向该实例的指针 ),但结构的最后一个成员具有多个命名成员 可能具有不完整的数组类型;这样的结构(以及可能包含 递归地,这种结构的成员)不应是该结构的成员或 数组的元素。

同上。

即使结构类型本身在定义的void结束之前是不完整的,但指向它的任何 pointer 都是完整的(也就是说,其大小是已知的)。

指向类型的大小对于指针算术很重要(即,}产生的地址值将取决于p + 1所指向的东西的大小)。但是,存储指针本身并不重要。