#include <iostream>
int Value ()
{
int x = 90;//creates a variable x
return x;//returns the value x, into the caller
//x is destroyed because it is out of scope
}
int * ptr ()
{
int x = 7;//creates variable x
return &x;//returns a pointer to x
//x gets destroyed because it is out of scope
}
内部主要功能
int y = Value ();// y = 7
int *py = ptr ();
/* *py = 7, not Undefined Behaviour?? */
我创建了这段代码,在调试程序时,在我的监视窗口中我* py = 7。 难道我不会得到未定义的行为,并且程序崩溃,因为py指向现在有垃圾的地址(ptr(中的x)超出范围)
答案 0 :(得分:1)
函数ptr返回一个值,即局部变量x的地址。当您结束功能时,内存模型仅将此地址(&amp; x)标记为可写,但不会删除内存中的实际值。 因此,当你查看内存地址py的实际值时,你会看到值7但是当另一个函数要求一些内存时它可以被改变。
答案 1 :(得分:1)
我不应该得到未定义的行为
是。这就是你得到的。
不应该......程序崩溃
没有。该标准没有定义程序必须崩溃。相反,行为是未定义的。
答案 2 :(得分:0)
它变成了dangling pointer
。如果使用会导致问题。