Rac*_*hit -4 c pointers local-variables compiler-warnings
众所周知,局部变量具有局部范围和寿命.请考虑以下代码:
int* abc()
{
int m;
return(&m);
}
void main()
{
int* p=abc();
*p=32;
}
Run Code Online (Sandbox Code Playgroud)
这给了我一个函数返回局部变量地址的警告.我认为这是理由:一旦abc()完成,就会释放本地可验证的m.所以我们在主函数中解除引用无效的内存位置.
但是,请考虑以下代码:
int* abc()
{
int m;
return(&m);
int p=9;
}
void main()
{
int* p=abc();
*p=32;
}
Run Code Online (Sandbox Code Playgroud)
我在这里得到同样的警告.但我想m返回时仍会保留其生命周期.怎么了?请解释错误.我的理由是错的吗?
小智 10
首先,注意int p=9;永远不会达到,所以你的两个版本在功能上是相同的.程序将为内存分配内存m并返回该内存的地址; return语句下面的任何代码都是不可缓存的.
其次,m函数返回后,实际上并没有取消分配局部变量.相反,程序会考虑内存可用空间.该空间可能用于其他目的,或者它可能保持未使用状态并永远保持其旧值.因为您无法保证在abc()函数退出后内存会发生什么,所以您不应尝试以任何方式访问或修改它.