为什么指针指向它所指向的地方

Why does the pointer point where it points?

本文关键字:指针 为什么      更新时间:2023-10-16

我不明白,为什么指针前面指向对象berta(我知道Anton和berta是在堆栈上创建的)

1 Hello* front;
2
3 void createHello() {
4   Hello anton("Anton");
5   front = &anton;
6 }
7
8 int main() {
9   createHello();
10  Hello berta("Berta");
11  front->body();
12}
1 class Hello {
2     Hello(const char* name) : name(name) {
3     out.print(name);
4     out.print(" ctor;");
5   }
6
7   ~Hello(){
8     out.print(name);
9     out.print(" dtor;");
10  }
11
12  void body () {
13    out.print(name);
14    out.print( " body;");
15  }
16
17  const char* name;
18};

输出:Anton医生;Anton医生;Berta医生;

out.print()是一个简单的函数,用于在监视器上打印字符串

我就知道会这样:

createHello() -寄存器被压入堆栈,返回地址被压入堆栈

Hello anton(" anton ") -对象将被压入堆栈

front = &anton;指针指向anton

的地址

esp -将设置到函数调用

之前的位置

你好,伯蒂("伯");对象"berta"会被压入堆栈

前身体-> ();-打印伯塔体;这到底是怎么回事?

我的意思是前指针应该指向堆栈中的不同位置:

1。{lowerAddress}

anton <-front <-esp

返回地址

注册

{higherAddress}

2。

安东& lt;前面

返回地址

注册

& lt; esp

3。

anton<前>

返回地址

berta

所以应该只有两种可能性:anton将被部分覆盖,或者它仍然存在,而berta位于更高的存储位置。如果anton将被部分覆盖,那么应该会出现一些rnd的东西在front->body。如果anton不会被重写,那么它应该返回" anton body;"。

你能给我解释一下为什么没有发生吗?相反,berta覆盖了对象anton,所以前面正好指向berta?

@Edit forget *,所以前面是一个指针

@Edit我从来不会以这种方式编程——我的大学给了我这个垃圾——我不知道如何解决它——是的,我只能说"嗯,berta是在anton上创建的,并且覆盖了他",但我不明白为什么——通常berta应该在更高的地址上创建。

一旦你对createHello()的调用返回,Anton就超出了作用域,它的析构函数被调用,因此你的输出:

Anton ctor;Anton dtor;

此时,front是一个悬空指针。

然后你创建Berta,它被推到堆栈中Anton曾经存在的位置,导致front指向Berta。

如果您使用new在堆上分配Anton,则Anton将在程序的整个生命周期中持续存在,或者直到您调用delete

编辑:根据戴尔的评论,这种行为应该被认为是巧合。如果在编写代码时假设Berta总是存在于Anton的同一地址,那将是不明智的。