我最近读到有关 C 中的作用域规则。它说局部变量或自动变量仅在声明它的函数 block 内可用。一旦在函数之外,它就不再可见。此外,它的生命周期仅到函数体的最后一个右大括号结束为止。
问题来了。当局部变量的地址从函数返回到调用函数时会发生什么?
例如:-
main()
{
int *p=fun();
}
int * fun()
{
int localvar=0;
return (&localvar);
}
一旦控制从函数 fun 返回,变量 localvar 就不再存在。那么 main 如何访问该地址的内容呢?
最佳答案
可以返回地址,但无法可靠地读取存储在地址中的值。事实上,甚至不清楚您是否可以安全地分配它,尽管在大多数机器上很可能不会出现问题。
您通常可以读取地址,但行为未定义(读取“不好:不惜一切代价避免!”)。特别是,地址可能用于其他函数中的其他变量,因此如果您在调用其他函数后访问它,您肯定不太可能看到返回指针的函数存储在变量中的最后一个值。
Why then is a function returning a pointer ever required?
原因之一通常是“动态内存”。 malloc()
系列函数返回指向新(非堆栈)内存的指针。
另一个原因是“在传递给我的值中在此位置找到了一些东西”。考虑 strchr()
或 strstr()
。
另一个原因是“返回指向静态对象的指针,隐藏在函数中或包含函数源的文件中”。考虑 asctime()
等(并担心线程安全)。
可能还有其他一些,但这些可能是最常见的。
请注意,这些都不会返回指向本地(基于堆栈)变量的指针。
关于c - C 中的作用域规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8454208/