我正在阅读这篇文章 ( http://www.codeproject.com/Articles/627/A-Beginner-s-Guide-to-Pointers ),其中有一些代码解释了我们应该使用它们的一个原因。例如。动态分配。
例如 1。错误的程序:
“这个程序首先调用了SomeFunction函数,它创建了一个名为nNumber的变量,然后让pPointer指向它。然而,这就是问题所在。当函数离开时,nNumber被删除,因为它是一个局部变量变量。当执行离开定义它们的 block 时,局部变量总是被删除。这意味着当 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/