【问题标题】:Accessing function variables outside the function scope [duplicate]访问函数范围之外的函数变量[重复]
【发布时间】:2016-04-13 20:18:11
【问题描述】:

我现在学习cpp一个月了,我一直认为函数内部的变量,在堆栈上初始化,不能从函数范围之外访问。但是,当我使用指向函数成员的全局指针时,情况似乎并非如此:

#include <iostream>

void fun(void); int *pInt;

int main(int argc, char **argv) {

  pInt = 0;   
  fun();   
  std::cout << "*pInt = " << *pInt << std::endl;
  return 0; 
}

void fun(void) {   
  int a = 3;   
  pInt = &a; 
}

编译和运行它不会产生任何错误,并且确实会打印出预期的结果。 为什么会这样?在函数 fun 超出范围后,“a”是否应该超出范围(以及它的值)?

【问题讨论】:

  • 这称为dangling pointer。请参阅诸如 this 之类的问题,这些问题已在 SO 上得到解答。
  • 编译器不会生成故意破坏 pInt 指向的内存内容的代码,只是当 a 超出范围时,所有关于内存会发生什么的赌注都没有了pInt 指向。也许由于其他操作会覆盖它,它会变成垃圾,也许不会 - 但是您应该始终假设访问此内存不会给您期望的结果。

标签: c++ pointers scope


【解决方案1】:

不,你看到的是undefined behavior

一旦fun() 函数完成执行,a 将不复存在。因此,在main() 中,任何取消引用指针(之前)指向a 的内存位置的尝试都将调用UB。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多