指向C++中局部变量的指针
Pointer to local variable in C++
可能重复:
可以使用局部变量';内存是否在其范围之外被访问?
我在C++中有以下代码
int* foo()
{
int myVar = 4;
int* ptr = &myVar;
return ptr;
}
int main()
{
printf("val= %d", *foo());
return 0;
}
我得到的输出是:
val = 4
所以我的问题是,既然myVar是一个局部变量,它不应该在函数返回后消失吗?指向它的指针不应该也是空指针吗?
所以我的问题是,既然myVar是一个局部变量,它应该在函数返回后消失吗?
是的。它会指向您设置的地址。但是,该区域是函数的本地区域。假设它所指向的东西超出范围后,它就不属于你了。
它是不正确的:
uint8_t* p = (uint8_t*)malloc(count);
free(p);
p[0] = 1;
但对于您或您的工具来说,诊断错误要困难得多,因为该区域将存在于堆栈上(除非进行了优化)。
指向它的指针不应该也是空指针吗?
没有。C和C++不能为您管理这些。
在您的情况下,printf("val= %d", *foo())
正在打印垃圾值。由于没有其他代码,该数据没有更改。
你运行这个代码,你会得到的想法
int* foo()
{
int myVar = 4;
int* ptr = &myVar;
return ptr;
}
int* foo1()
{
int myVar = 5;
int* ptr = &myVar;
return ptr;
}
int main()
{
int* x = foo();
int* x1 = foo1();
printf("val= %d", *x);
return 0;
}
ptr*处的地址将保持分配状态,如果您再次调用函数,它将更改指针。至少这是我的理论。由于性能原因,C++不会覆盖您的指针。
int foo(int val) {
int myVar = val;
int* ptr = &myVar;
return ptr;
}
int main()
{
int *ptr = foo(4);
foo(3);
printf("val= %d", *ptr); //will print 3
return 0;
}
包含包含int myvar和属于该函数的任何其他局部变量的地址的内存在函数返回时未分配,但C中没有清理过程,因此内存中的值将在返回和打印访问它之间的那一小段时间内保持不变。
在C中取消分配(或释放)内存就像在Windows中删除一个文件,其中文件内容暂时仍在驱动器上,但任何时候该区域需要其他内容时都会被覆盖。你仍然可以阅读内容,但你不应该相信你读到的内容。
相关文章:
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 将共享指针传递给函数参数 - 将其分配给局部变量的正确方法是什么
- C++ - 指向函数中局部变量的指针
- 指针 与局部变量的关系
- 指针被分配给错误的局部变量
- 通过静态局部变量的参考/指针返回
- 指针或局部变量,用于函数的输出参数
- 通过指针修改子函数中函数的局部变量的内容
- 局部变量与指针性能
- 为什么由指针和对象构建的局部变量显示不同的输出
- 返回局部变量C++的指针
- 为什么我们使用指针而不是局部变量
- 指向C++中局部变量的指针
- 指针可以将局部变量的内存指向其范围之外?
- 列表、指针和局部变量
- 我如何使一个函数指针引用一个局部变量
- 类局部变量的指针
- 函数中指向局部变量的全局指针
- 如何在g++中设置警告,以警告返回指向局部变量的指针
- 通过创建局部变量减少堆栈指针