1

可能重复:
可以在其范围之外访问局部变量的内存吗?

我在 C++ 中有以下代码

int* foo()
{
    int myVar = 4;
    int* ptr = &myVar;
    return ptr;
}

int main()
{
   printf("val= %d", *foo());
   return 0;
}

我得到的输出是:

val = 4

所以我的问题是,由于 myVar 是一个局部变量,它不应该在函数返回后消失吗?指向它的指针也不应该是空指针吗?

4

4 回答 4

2

所以我的问题是,由于 myVar 是一个局部变量,它应该在函数返回后消失吗?

是的。它将指向您设置的地址。但是,该区域是该功能的本地区域。在它指向的内容超出范围后,假设它不属于您。

它与以下内容一样不正确:

uint8_t* p = (uint8_t*)malloc(count);
free(p);
p[0] = 1;

但是对于您或您的工具来说,诊断错误要困难得多,因为该区域将存在于堆栈中(除非经过优化)。

指向它的指针也不应该是空指针吗?

不,C 和 C++ 不会为您管理这个。

于 2012-04-06T02:31:30.220 回答
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; 
    } 
于 2012-04-06T04:41:42.737 回答
0

包含保存int myvar的地址和属于该函数的任何其他局部变量的内存在函数返回的那一刻未被分配,但是 C 中没有清理过程,因此内存中的值将在返回之间的那一小段时间内保持不变和 printf 访问它。

在 C 中取消分配(或释放相同的东西)内存就像在 Windows 中删除文件一样,其中文件内容暂时仍在驱动器上,但只要该区域再次需要其他内容时就会被覆盖。您仍然可以阅读内容,但您不应该相信您阅读的内容。

于 2012-04-06T03:10:42.917 回答
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;
}
于 2012-04-06T02:35:16.177 回答