C++ 为什么指针指向它所指向的地方?

C++ 为什么指针指向它所指向的地方?,c++,pointers,compiler-construction,stack,C++,Pointers,Compiler Construction,Stack,我不明白,为什么指针前面指向对象berta(我知道anton和berta是在堆栈上创建的) 产出:安东·克托尔;安东·德托尔;贝尔塔·克托尔;贝尔塔机构;贝尔塔·德托尔 print()是一个在监视器上打印字符串的简单函数 我认为这会发生: createHello()-寄存器被推送到堆栈上,返回地址被推送到堆栈上 Hello anton(“anton”)-对象将被推到堆栈上 前=&anton;指针指向安东的地址 esp-将设置为函数调用之前的位置 你好,伯塔(“伯塔”);-对象“berta”将被推

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

产出:安东·克托尔;安东·德托尔;贝尔塔·克托尔;贝尔塔机构;贝尔塔·德托尔

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

我认为这会发生:

createHello()-寄存器被推送到堆栈上,返回地址被推送到堆栈上

Hello anton(“anton”)-对象将被推到堆栈上

前=&anton;指针指向安东的地址

esp-将设置为函数调用之前的位置

你好,伯塔(“伯塔”);-对象“berta”将被推到堆栈上

前->车身();-印刷体;这到底是为什么

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

1.{lowerAddress}


anton一旦对
createHello()
的调用返回,anton就会超出范围并调用其析构函数,因此您的输出:

Anton ctor;Anton dtor;
此时,
front
是一个悬空指针

然后创建Berta,它被推到堆栈上Anton过去所在的位置,导致
front
指向Berta

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


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

一旦您对
createHello()
的调用返回,Anton将超出范围并调用其析构函数,因此您的输出:

Anton ctor;Anton dtor;
此时,
front
是一个悬空指针

然后创建Berta,它被推到堆栈上Anton过去所在的位置,导致
front
指向Berta

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


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

一旦您对
createHello()
的调用返回,Anton将超出范围并调用其析构函数,因此您的输出:

Anton ctor;Anton dtor;
此时,
front
是一个悬空指针

然后创建Berta,它被推到堆栈上Anton过去所在的位置,导致
front
指向Berta

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


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

一旦您对
createHello()
的调用返回,Anton将超出范围并调用其析构函数,因此您的输出:

Anton ctor;Anton dtor;
此时,
front
是一个悬空指针

然后创建Berta,它被推到堆栈上Anton过去所在的位置,导致
front
指向Berta

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



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

Anton在第6行去世。贝尔塔可能得到了他的内存空间。
const char name
用于初始化
const char*
。。。有趣。你期望这会起作用吗?这最终会导致未定义的行为吗?@Pavel Spoiler tags拜托!前面是怎样的合法,当
front
既不是参考变量也不是指针时?安东死在第6行。贝尔塔可能得到了他的内存空间。
const char name
用于初始化
const char*
。。。有趣。你期望这会起作用吗?这最终会导致未定义的行为吗?@Pavel Spoiler tags拜托!前面是怎样的合法,当
front
既不是参考变量也不是指针时?安东死在第6行。贝尔塔可能得到了他的内存空间。
const char name
用于初始化
const char*
。。。有趣。你期望这会起作用吗?这最终会导致未定义的行为吗?@Pavel Spoiler tags拜托!前面是怎样的合法,当
front
既不是参考变量也不是指针时?安东死在第6行。贝尔塔可能得到了他的内存空间。
const char name
用于初始化
const char*
。。。有趣。你期望这会起作用吗?这最终会导致未定义的行为吗?@Pavel Spoiler tags拜托!前面是怎样的legal,当
front
既不是参考变量也不是指针时?我只会添加“偶然”。返回对局部变量的引用是未定义的行为。您的程序失败的具体方式因编译器、编译时选项和月相而异。@DaleWilson据我们所知,只要在
createHello()
和Berta的实例化之间没有其他东西被推到堆栈中,Berta将始终存在于与Anton完全相同的堆栈内存地址。我很想看一个例子,说明这不是真的。在调用createHello()之前创建berta,我保证berta和Anton会占用不同的内存区域,对吗?没有任何东西可以阻止编译器编写器分配