c++ - 初始化包含相同类型结构指针的结构指针
问题描述
我试图了解指向结构对象的指针(包含指向相同类型的结构的指针)的初始化是如何发生的。例如我有一个struct
:
struct node {
node *next;
};
假设我有一个内存池的起始地址,即池是指向起始位置的指针。(为了争论,假设起始内存是1001
。)
char* pool[65536];
现在我声明一个类型的指针node
并通过reinterpret_cast
.
node* a =reinterpret_cast<node *>(pool);
当前a
指向内存1001
。现在我声明另一个指针
node* b;
b=a;
现在发生的事情是指向与ieb
相同的地址。指针指向某个预期的随机位置,但指针的地址与指向的地址相同,即。IEa
1001
b->next
b->next
b
1001
&b->next = b
我不明白为什么地址与b->next
指针指向的地址相同b
?按照我的理解b->next
应该是设在哪儿b
。
PS:我试图找出这是如何发生的,但找不到相关文档。如果此类问题已在某些文档或其他问题中得到解答,请务必提供链接。
PPS:在和我的同事进一步讨论这个问题后,我发现这b
是一个指针,而不是一个对象。它指向一个位置(即1001
),根据b
节点对象存在的位置包含指针next
,因此b->next
(&b->next
)的地址与指向的位置相同b
。
解决方案
让我们以基本前提为例,但用一个有效的例子代替:
node* a = new node;
node* b = a;
现在a
和b
都指向同一个对象,内存中的同一个位置。
从图形上看,它看起来像这样:
+---+ | 一个 | --\ +---+ \ +-----------------+ >--> | 节点对象 | +---+ / +-----------------+ | 乙 | --/ +---+
因为两者a
和b
都指向完全相同的对象,所以它遵循a->next
并且b->next
必须完全相同。您可以通过打印&a->next
和来验证它&b->next
。
a->next
和的(当前不确定的)值b->next
可能看起来不同的唯一方式是由于未定义的行为。首先,因为a->next
(因此b->next
)是不确定的,以任何方式使用它的值,除了初始化它会导致 UB。其次,如果您没有初始化a
或b
以正确的方式进行初始化(例如,您确实像在您的问题中那样初始化它),那么当您取消引用a
或b
.
推荐阅读
- mysql - MySQL:如何检查字段值是否存在于同一个表的逗号分隔字段中
- mysql - 不稳定的 MySQL st_distance_sphere 结果
- r - 调整ggeffects中预测值的范围
- django - 来自 Django 的电子邮件中的 html
- apollo-client - readFragment 返回一个类型的所有对象
- mysql - 重启电脑后Mysql工作台失去连接
- c - 尝试以字节为单位打印目录和所有子目录中的总空间
- regex - 如何使用正则表达式分隔电话号码中的空格?
- mysql - 安装mysql时如何解决写入配置错误?
- java - 为具有循环引用 Java 的类实现 equals()