为什么指针指向它所指向的地方
Why does the pointer point where it points?
我不明白,为什么指针前面指向对象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的同一地址,那将是不明智的。
- 为什么使用 "this" 指针调用派生成员函数?
- 为什么++(*p)更改指针值
- C++取消引用指针.为什么会发生变化
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 为什么指针不写入类的地址?
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 为什么要增加导致崩溃的指针
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 共享指针:为什么没有双免费
- 指向2D数组的指针(为什么起作用)
- 函数指针 - 为什么,什么时候我可以没有
- C++ 函数指针 -- 为什么会这样
- 不支持在c或c++中添加两个指针.为什么?
- 无效的指针-为什么
- 模板基类可以存储指向派生但不能存储对象的指针 - 为什么
- 在信号代码中将整数转换为函数指针-为什么这样做?
- 指向结构体作为函数参数的指针-为什么不更新其值