【问题标题】:C++ Scope of Pointer? [closed]C ++指针范围? [关闭]
【发布时间】:2022-01-25 17:55:48
【问题描述】:

我有一个问题 例如我有下面的代码:


void function1()
{
    Car car;
    car.color = 10;
    carPtr = &car;
    std::cout << carPtr->color;
}

void function2()
{
    std::cout << carPtr->color;
}

int main()
{
    function1();
    function2();
}

出于某种奇怪的原因,此代码有效。 如果我在 function1() 范围内创建了一个 car 实例,那么为什么我可以在 function2() 中使用 car ??? 不应该让 carPtr 在它离开 function1() 的那一刻指向 nullptr,因为 car 存在于 function1() 的范围内 是否将“汽车”对象的数据复制到 function2() 中,这将如何工作???有人可以解释发生了什么吗?提前致谢!

【问题讨论】:

  • 发布的代码不可能工作。没有包含文件可以将std::cout 带到聚会中,也没有任何carPtrCar 的声明。这段代码不能编译更少的工作。假设 carPtr 是一些全局的 Car * 你正在调用未定义的行为,这意味着代码被破坏了原始的。未定义的行为意味着它可能看起来有效,也可能无效,它可能真的做anything,包括nothing。该程序格式不正确。您将 observed 行为与 defined 行为混淆了。后者导致前者,前者是后者的保证。

标签: c++ pointers memory scope


【解决方案1】:

每个函数在堆栈中都有自己的堆栈帧。因此,当您将car 的地址绑定到carPtr 时,carPtr 是指向函数1 堆栈帧中地址的指针。然后function1退出,栈帧会被回收(一般是加上栈指针)。 function1 堆栈帧的地址可能会在 function2 执行时重用。因此,car 的值可能由于 function2 的执行而损坏。上面的代码将导致未定义的行为。改变执行环境可能会改变这个程序的输出。

carPtr 离开 function1() 时不应该指向 nullptr

不,carPtr 将始终指向此地址,除非您明确更改它。唯一不同的是地址是否合法。

【讨论】:

    猜你喜欢
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多