首页 > 解决方案 > 初始化包含相同类型结构指针的结构指针

问题描述

我试图了解指向结构对象的指针(包含指向相同类型的结构的指针)的初始化是如何发生的。例如我有一个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相同的地址。指针指向某个预期的随机位置,但指针的地址与指向的地址相同,即。IEa1001b->nextb->nextb1001

&b->next = b

我不明白为什么地址与b->next指针指向的地址相同b?按照我的理解b->next应该是设在哪儿b

PS:我试图找出这是如何发生的,但找不到相关文档。如果此类问题已在某些文档或其他问题中得到解答,请务必提供链接。

PPS:在和我的同事进一步讨论这个问题后,我发现这b是一个指针,而不是一个对象。它指向一个位置(即1001),根据b节点对象存在的位置包含指针next,因此b->next&b->next)的地址与指向的位置相同b

在此处输入图像描述

标签: c++pointersstructc++17

解决方案


让我们以基本前提为例,但用一个有效的例子代替:

node* a = new node;
node* b = a;

现在ab都指向同一个对象,内存中的同一个位置。

从图形上看,它看起来像这样:

+---+
| 一个 | --\
+---+ \ +-----------------+
          >--> | 节点对象 |
+---+ / +-----------------+
| 乙 | --/
+---+

因为两者ab都指向完全相同的对象,所以它遵循a->next并且b->next必须完全相同。您可以通过打印&a->next和来验证它&b->next

a->next和的(当前不确定的)值b->next可能看起来不同的唯一方式是由于未定义的行为。首先,因为a->next(因此b->next)是不确定的,以任何方式使用它的值,除了初始化它会导致 UB。其次,如果您没有初始化ab以正确的方式进行初始化(例如,您确实像在您的问题中那样初始化它),那么当您取消引用ab.


推荐阅读