众所周知,局部变量具有局部作用域和生存期。考虑以下代码:
int* abc()
{
int m;
return(&m);
}
void main()
{
int* p=abc();
*p=32;
}
这给了我一个警告:函数返回局部变量的地址。 我认为这是合理的: 一旦 abc() 完成,本地可验证 m 就会被释放。因此,我们在主函数中取消引用无效的内存位置。
但是,请考虑以下代码:
int* abc()
{
int m;
return(&m);
int p=9;
}
void main()
{
int* p=abc();
*p=32;
}
在这里我收到了同样的警告。但我猜 m 返回时仍会保留其生命周期。怎么了?请解释错误。我的理由有错吗?
最佳答案
首先,请注意 int p=9;
永远不会到达,因此您的两个版本在功能上是相同的。程序将为m
分配内存并返回该内存的地址; return 语句下面的任何代码都是无法访问的。
其次,局部变量m
在函数返回后实际上并没有被释放。相反,程序会考虑内存可用空间。该空间可能会用于其他目的,或者可能会保持未使用状态并永远保持其旧值(value)。因为您无法保证 abc()
函数退出后内存会发生什么,所以您不应尝试以任何方式访问或修改它。
关于c - c 中的 & 符号错误和生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10591293/