【请问】局部变量及悬垂指针有关问题

【请教】局部变量及悬垂指针问题
请教各位大神,

以下代码中,为何第一次 printf 的时候 *iPtr 的值会是10呢?

变量i不应该在f1函数结束后就释放了吗?

局部变量i到底在什么时候释放的呢?


int *iPtr = NULL;  
void f1()  
{  
    int i = 10;  
    iPtr = &i;  
}  
  
void CtestAreaDlg::OnBnClickedButtonPtr()  
{  
    // TODO:  在此添加控件通知处理程序代码  
    f1();  
    printf("the value of the ptr is %d\n",*iPtr);  
    Sleep(1000);  
    printf("the value of the ptr now is %d\n",*iPtr);  
}   


【请问】局部变量及悬垂指针有关问题
------解决方案--------------------
i 的确是在函数结束后就释放了,但是被释放掉的那块内存不意味着被马上覆盖掉,
只是说 随时都有可能被覆盖掉
所以 这么做是很危险的
------解决方案--------------------
一个良好的习惯是调用指针完毕之后,再把指针置NULL
------解决方案--------------------
引用:
请教各位大神,

以下代码中,为何第一次 printf 的时候 *iPtr 的值会是10呢?

变量i不应该在f1函数结束后就释放了吗?

局部变量i到底在什么时候释放的呢?


int *iPtr = NULL;  
void f1()  
{  
    int i = 10;  
    iPtr = &i;  
}  
  
void CtestAreaDlg::OnBnClickedButtonPtr()  
{  
    // TODO:  在此添加控件通知处理程序代码  
    f1();  
    printf("the value of the ptr is %d\n",*iPtr);  
    Sleep(1000);  
    printf("the value of the ptr now is %d\n",*iPtr);  
}   


【请问】局部变量及悬垂指针有关问题


说明释放并不是内存清0,而是标记为可用
------解决方案--------------------
引用:
i 的确是在函数结束后就释放了,但是被释放掉的那块内存不意味着被马上覆盖掉,
只是说 随时都有可能被覆盖掉
所以 这么做是很危险的

解释的很透彻,
给一个未知指针赋值时,可以先null,或者用完就null,不然就容易变成野指针
------解决方案--------------------
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。