我正在阅读这篇文章(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/

10-11 15:54