c++ - 指针 - 动态分配困惑

标签 c++ pointers

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

相关文章:

C++ 访问器——我应该返回一个指向成员变量的指针还是返回实际的成员变量本身?

指针与整数C的比较与赋值

c++ - 我可以以 1 Gbps 的速度写入硬盘吗?

c - C 中的树遍历和串联崩溃

c++ - 回顾我的 C++ 多维数组指针

c++ - 用 C++ 将不同的结构写入文件?

c - 结构体中的指针问题

c++ - pthreads 中的内存模型规范

c++ - CUDA 函数仅适用于某些元素

c++ - 使用 OpenCV 2.4.9 构建 ROS 包时出现问题