我正在阅读这篇文章(http://www.codeproject.com/Articles/627/A-Beginner-s-Guide-to-Pointers),其中包含一些代码来解释我们为什么要使用它们的一个原因。例如。动态分配。
例如1。错误的程序:
“此程序首先调用SomeFunction函数,该函数创建一个名为nNumber的变量,然后使pPointer指向它。然后,问题出在哪里。当该函数离开时,nNumber被删除,因为它是一个局部变量。Local当执行离开定义的块时,变量总是被删除,这意味着当SomeFunction返回到main()时,该变量被删除,因此pPointer指向该变量以前所在的位置,该变量不再属于该程序。 ”
#include <stdio.h>
int *pPointer;
void SomeFunction()
{
int nNumber;
nNumber = 25;
// make pPointer point to nNumber:
pPointer = &nNumber;
}
void main()
{
SomeFunction(); // make pPointer point to something
// why does this fail?
printf("Value of *pPointer: %d\n", *pPointer);
}
例如2。正确的程序:
“当调用SomeFunction时,它将分配一些内存并使pPointer指向它。这次,当函数返回时,新的内存将保持不变,因此pPointer仍指向有用的东西。这就是动态分配!”
#include <stdio.h>
int *pPointer;
void SomeFunction()
{
// make pPointer point to a new integer
pPointer = new int;
*pPointer = 25;
}
void main()
{
SomeFunction(); // make pPointer point to something
printf("Value of *pPointer: %d\n", *pPointer);
}
我的问题:
上面的解释对我来说是完全有意义的,我对为什么使用指针感到很好。然后,我决定运行程序以查看发生了什么。我期望第一个显示* pPointer的随机数,因为25已被删除。两个程序正确显示“ * pPointer的值:25”。第一个程序应该不会像教程中那样失败吗?
最佳答案
这是因为它是未定义的行为。您只是很幸运,没有在该位置上写入printf
函数。
关于未定义行为的一件好事(如果我可能具有讽刺意味)是它是未定义的,您无法真正预先知道会发生什么。另请参见nasal demons
。
关于c++ - 指针-动态分配困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17425791/