Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C/C++:结构如何包含指向自身的指针?_C++_C - Fatal编程技术网

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

C/C++:结构如何包含指向自身的指针?,c++,c,C++,C,这个问题更多的是基于理论,而不是实际实施 我想知道的是,在代码中: struct temp { int num; struct temp *next; }; 在上面的结构中,当我们实例化它时,编译器如何决定应该在内存中分配多少空间 如果我尝试干运行代码,整数的大小将是2或4字节,然后,如果我尝试查找指向结构本身的指针的大小,我将输入一个包含另一个整数和指向自身的指针的结构 根据这种逻辑,编译器在决定将空间分配给该结构的元素时将进入一个无限循环,那么空间是如何决定的呢 顺便说一句

这个问题更多的是基于理论,而不是实际实施

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

struct temp {
    int num;
    struct temp *next;
};
在上面的结构中,当我们实例化它时,编译器如何决定应该在内存中分配多少空间

如果我尝试干运行代码,整数的大小将是2或4字节,然后,如果我尝试查找指向结构本身的指针的大小,我将输入一个包含另一个整数和指向自身的指针的结构

根据这种逻辑,编译器在决定将空间分配给该结构的元素时将进入一个无限循环,那么空间是如何决定的呢


顺便说一句,我自己用sizeof运算符试图找出这个结构的大小,结果是16字节,整数的大小是4字节。。。我很想知道它是如何确定这个16字节的数字作为所需的空间的

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

指针的大小是固定的,所以它指向的结构的大小无关紧要。在您可能遇到的大多数系统上,指针的大小为4字节或8字节

对于给定的结构,int字段可能使用4个字节,struct temp*字段可能使用8个字节。这意味着结构的大小将至少为12个字节,可能是16个字节,这是由于适当对齐的填充

另一方面,如果你有这样的事情:

struct temp {
    int num;
    struct temp next;
};
这是不合法的,因为结构包含自身的副本,而该副本又包含自身的副本,依此类推

在上面的结构中,当我们实例化它时,编译器如何决定应该在内存中分配多少空间

指针类型采用固定大小,不依赖于指向的类型IOW,struct temp*的大小和表示形式不以任何方式依赖于struct temp*的大小或表示形式。此外,所有指向结构类型的指针都具有相同的大小:

6.2.5类型 ... 28无效指针的表示和对齐要求应与 指向字符类型的指针。48类似地,指向 兼容类型应具有相同的表示和对齐要求。全部的 指向结构类型的指针应具有相同的表示和对齐要求 就像我们彼此一样。所有指向联合类型的指针应具有相同的表示形式和 校准要求彼此一致。指向其他类型的指针不必具有相同的属性 表示或对齐要求。 在x86这样的平台上,所有指针类型都具有相同的大小和表示形式,但该标准必须考虑古怪的体系结构

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

6.7.2.1结构和联合规范 ... 3结构或接头不得包含不完整或功能类型的构件, 结构不应包含自身的实例,但可以包含指向实例的指针 其本身,但具有多个命名成员的结构的最后一个成员除外 可能有不完整的数组类型;这种结构和任何包含 递归地,此类结构的构件不得为结构或结构的构件 数组的元素。 同上

即使结构类型本身在定义的结尾}之前是不完整的,但是指向它的任何指针都是完整的,也就是说,它的大小是已知的


指针运算中指向类型的大小很重要,即p+1产生的地址值将取决于p指向的对象的大小。但是,存储指针本身并不重要。

指针的大小不取决于它指向的对象的类型。您描述的情况类似于struct temp{int num;struct temp next;};正如您所解释的,这是不可能解析的。sizeof不是一个函数。16个字节:4个用于int,可能8个用于指针。额外的4是填充。指向某个类型T的指针的大小与T的大小无关。this关键字会让你大吃一惊。。。