指针可以将局部变量的内存指向其范围之外?
Pointer can point local variable's memory outside it's scope?
void foo(int** ptr) {
int value = 4;
*ptr = &value;
// **ptr = value;
}
int main(void) {
int value = 7;
int* ptr = &value;
foo(&ptr);
cout << *ptr << endl; // 4
return 0;
}
我的问题是-由于value = 4
从foo
返回后不再有效/超出范围,为什么*ptr
显示4
而不是一些垃圾值?
正式回答:未定义行为。
实际答案:堆栈上还没有其他操作覆盖该值。
因为返回的是指向局部变量的指针,所以这是未定义的行为。这包括"看起来"可以工作,但在一般情况下依赖它是一个糟糕的主意。
在这个特定的例子中,值留在堆栈上,并且似乎生成的代码在调用foo
之后,在任何其他函数调用之前获取*ptr
。因此,该值没有被任何其他函数调用覆盖。
如果您要在foo(&ptr)
和cout << ...
语句之间插入一个函数调用,则该值很可能是垃圾。
相关文章:
- 如何在c/c++中检查两个任意内存范围是否重叠
- 在 Visual Studio 调试器中,如何从内存中打印字节范围?
- 我们如何准备小内存池,其中每个线程可以独立访问某些位置范围?
- Eratosthenes C 的筛子 - 内存处的范围错误
- 向量:内存处的范围错误
- 为什么我在具有 16 GB 内存的 Mac 上看到数 TB 范围内的 C++ 指针
- std::vector<std::vector<int>>:调试断言失败。C++矢量下标超出范围保留内存
- 访问字符阵列中不可用的内存位置(超出范围值)
- 为什么Valgrind-Massif和最高内存消耗之间会有不同的范围
- C 内存管理问题,std :: vector nevere rase内存超出范围
- 用于查找范围重叠的更节省内存的算法
- 对范围和堆内存生存期感到困惑
- 当动态内存不超出范围时,为什么动态内存不会被清洁
- 容器范围和内存管理
- Linux的VirtualQueryEx替代方案-如何获得另一个进程的虚拟内存范围
- 在类方法中使用新运算符动态分配内存的寿命和范围是多少
- 更改自动分配内存的范围是否会影响性能
- STD:超出范围的内存位置
- 内存引用范围问题:变量值被重置,如何将值分配给LPCWSTR
- 在范围内存在不可复制的局部变量时按值捕获