可能重复:
Can a local variable's memory be accessed outside its scope?
我在C ++中有以下代码
int* foo()
{
int myVar = 4;
int* ptr = &myVar;
return ptr;
}
int main()
{
printf("val= %d", *foo());
return 0;
}
我得到的输出是:
val = 4
所以我的问题是因为myVar是一个局部变量,在函数返回后不应该消失吗?并且它的指针也不应该是空指针吗?
答案 0 :(得分:2)
所以我的问题是因为myVar是一个局部变量,它应该在函数返回后消失吗?
是。它会指向您设置的地址。但是,该地区是该职能的地方。假设它超出范围之后不属于你。
它与:
一样不正确uint8_t* p = (uint8_t*)malloc(count);
free(p);
p[0] = 1;
但是您的或您的工具诊断错误要困难得多,因为该区域将存在于堆栈中(除非经过优化)。
并且它的指针也不应该是空指针吗?
没有。 C和C ++不会为你管理这个。
答案 1 :(得分:2)
在您的情况下,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;
}
答案 2 :(得分: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;
}
答案 3 :(得分:0)
包含 int myvar 的地址的内存以及属于该函数的任何其他局部变量在函数返回时都是未分配的,但是在C中没有清理过程,所以内存中的值在返回和printf访问它之间的那个小时刻将保持不变。
在C中取消分配(或释放,同样的东西)内存就像删除Windows中的文件,其中文件内容暂时仍在驱动器上,但是在任何时候再次需要该区域时将被覆盖。你仍然可以阅读内容,但你不应该相信你所读的内容。