C++ 为什么指针指向它所指向的地方?
我不明白,为什么指针前面指向对象berta(我知道anton和berta是在堆栈上创建的) 产出:安东·克托尔;安东·德托尔;贝尔塔·克托尔;贝尔塔机构;贝尔塔·德托尔 print()是一个在监视器上打印字符串的简单函数 我认为这会发生: createHello()-寄存器被推送到堆栈上,返回地址被推送到堆栈上 Hello anton(“anton”)-对象将被推到堆栈上 前=&anton;指针指向安东的地址 esp-将设置为函数调用之前的位置 你好,伯塔(“伯塔”);-对象“berta”将被推到堆栈上 前->车身();-印刷体;这到底是为什么 我的意思是,前指针应该指向堆栈中的不同位置: 1.{lowerAddress}C++ 为什么指针指向它所指向的地方?,c++,pointers,compiler-construction,stack,C++,Pointers,Compiler Construction,Stack,我不明白,为什么指针前面指向对象berta(我知道anton和berta是在堆栈上创建的) 产出:安东·克托尔;安东·德托尔;贝尔塔·克托尔;贝尔塔机构;贝尔塔·德托尔 print()是一个在监视器上打印字符串的简单函数 我认为这会发生: createHello()-寄存器被推送到堆栈上,返回地址被推送到堆栈上 Hello anton(“anton”)-对象将被推到堆栈上 前=&anton;指针指向安东的地址 esp-将设置为函数调用之前的位置 你好,伯塔(“伯塔”);-对象“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所在的同一地址的代码是不明智的。一旦您对
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会占用不同的内存区域,对吗?没有任何东西可以阻止编译器编写器分配