c - C 中的作用域规则

标签 c

我最近读到有关 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/

相关文章:

c - PostMessage 似乎不起作用?

c - 在 C 中取消引用双指针

c++ - fstream 文件 I/O 问题 - 何时关闭文件流

c - 针对特定处理器的优化

c - 从结构访问 union 成员

c - 这个指针代码在 64 位计算机上是否合法

c - 如何在C中进行参数化?

c++ - 如何换出内存块?

mysql - 为什么使用 mysql_real_connect 建立的与 MySQL 的单独连接似乎对插入设置了限制?

c - fopen() 总是返回 NULL