2019独角兽企业重金招聘Python工程师标准>>>

下面这段话来自百度百科:

静态局部变量属于静态存储方式,它具有以下特点:
    (1) 静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
    (2) 静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
    (3) 允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符。
    (4) 对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

        既然静态局部变量的生存期为整个源程序,那么能不能通过指针在作用域之外操作静态局部变量呢?

然后写了几行测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>char *func_static(const char *str)
{int length;static char static_str[1024];   // 定义函数作用域的静态局部变量printf("func_static: %s\n", static_str);length = sizeof(static_str) > strlen(str) ? strlen(str) : sizeof(static_str);strncpy(static_str, str, length);return static_str;              // 返回静态局部变量的指针
}int main(int argc, char *argv[])
{char *pstr;pstr = func_static("Hello world!");printf("       main: %s\n", pstr);printf("Change\n");pstr[0] = 'h';                  // 修改静态局部变量的值func_static("0");exit(0);
}

该程序在func_static函数中定义了一个函数作用域的局部静态变量,然后在作用域外(main函数中)通过指针输出该局部静态变量的内容,之后又在作用域外通过指针对该静态变量的值进行了修改。

编译并运行程序:

$ gcc main.c -Wall
$ ./a.out
func_static: main: Hello world!
Change
func_static: hello world!

编译时无错误和警告信息,程序正确运行,并且静态局部变量的值被修改。

按照此测试结果,那么“退出该函数后, 尽管该变量还继续存在,但不能使用它”这种说法应该可以说不十分准确。

转载于:https://my.oschina.net/lowkey2046/blog/295162

函数作用域的静态变量相关推荐

  1. c语言静态变量存在堆还是栈,c 类 static 函数 什么样是静态变量?嵌入式C语言的堆栈管理如何实现...

    C语言中静态变量是什么意思,有什么作用,static在数据类型前面表示什么 最近刚看了C存储类的章节.所以来说说. C语言为变量提供了⑤种不同的存储模型,或者说是存储类. ①个变量可以用存储时期描述, ...

  2. python中静态变量和静态方法_python类和函数中使用静态变量的方法

    本文实例讲述了python类和函数中使用静态变量的方法.分享给大家供大家参考.具体分析如下: 在python的类和函数(包括λ方法)中使用静态变量似乎是件不可能[Nothing is impossib ...

  3. 深入理解C语言系列之内存和地址的故事(虚拟内存分区、全局变量与静态变量、外部函数内部函数、选择性编译)

    文章目录 一.内存的分区 二.虚拟内存分区 三.变量作用域与静态变量 四.外部函数与内部函数 五.include与define选择性编译 一.内存的分区 1.内存分为:物理内存和虚拟内存. 物理内存︰ ...

  4. C/C++开发工程师面试题整理(一)——C语言关键字、预处理、静态变量全局变量、函数等

    整理一些找工作问到的题型和答案,加油吧,小菜鸡.不会的很多,感谢各位面试官的提问和解释,让我获益匪浅. 一.C语言关键字 1.关键字static的作用是什么(中兴面试题2020) 答:1.static ...

  5. 变量作用域函数作用域

    一. 变量作用域 1)全局变量 在全局环境下声明的变量被视为全局变量. 在没有使用var进行声明的时候,变量就被定义为全局变量.在ES5的严格模式下,如果变量没有使用var来声明是会报错的. 2)局部 ...

  6. 静态变量不能跨函数使用

    这个程序从语法上没有错误,但是从逻辑上讲是有问题的.因为调用function()函数已经执行完毕函数内存的静态变量已经释放,p就不能指向 i   但是却把 i 的内存变量值读取出来了,这是不可以的.静 ...

  7. C++匿名对象生命周期静态变量函数

    本文主要复习了c++构造函数的用法,然后对匿名对象的声明周期和C++的静态变量和静态成员函数的用法做了一些总结. 文章有如下三点: 1.主要讨论匿名对象的声明周期 2.引出的一个在构造函数中再一次调用 ...

  8. python创建函数内部静态变量

    c语言中有函数内部的静态变量,可以使得在调用函数时,变量的值为上一次退出该函数时变量的值,python中也有办法实现同样的功能,示例代码如下: def test():if ( not hasattr( ...

  9. @value 静态变量_你理解 PHP 中的静态方法吗?

    它仍然是一个有争议的话题.让我们尝试了解原因. 函数中的静态变量 您可能已经看过以下代码: function testStatic() {static $x = 0;$x++;return $x; } ...

最新文章

  1. 如何读论文才不至于发疯?
  2. 洛谷P1016 旅行家的预算 贪心
  3. 几种民间排毒养颜祛痘DIY自制面膜 - 健康程序员,至尚生活!
  4. android4.0浏览器在eclipse中编译的步骤
  5. php route取值,route命令详解
  6. Oracle备份提示,EXP-00091: 正在导出有问题的统计信息。
  7. 读债务危机0804:美国债务危机与调整(2007到2011)-泡沫出现
  8. Oracle一个中文汉字占用几个字节
  9. TypeScript 书写 .d.ts 文件的一些注意事项
  10. android wifi设备连接通信,通过wifi与设备进行通信(Android)
  11. pg_rewind 快速角色切换
  12. multisim红绿灯元器件在哪里_实验一:Multisim交通灯仿真.ppt
  13. mbedtls | 03 - 单向散列算法的配置与使用(MD5、SHA1、SHA256、SHA512)
  14. 教程向 | 安装 地表最强IDE---Microsoft Visual Studio 2022
  15. 基于ROS的A*算法代码学习
  16. 北航软件工程硕士_21考研择校 | 北京航空航天大学软件工程怎么样?
  17. Tensorflow版本更新命令
  18. 《区块链革命》读书笔记1可信的协议 引导未来:区块链经济七大设计原则
  19. 【漏洞复现】phpstudy隐藏后门漏洞的验证与利用
  20. 天语W700 adb驱动解决

热门文章

  1. kibana 更新 索引模式_elasticsearch – 如何在kibana中自动配置索引模式
  2. 8.继续分析一破解加密码获取-最最最简单的注册机
  3. 神经网络与机器学习 笔记—单神经元解决XOR问题
  4. hdu4179 限制最短路
  5. 【Linux 内核 内存管理】RCU 机制 ② ( RCU 机制适用场景 | RCU 机制特点 | 使用 RCU 机制保护链表 )
  6. 【Android 逆向】Android 权限 ( ro.product.cpu.abi 属性 | ro.zygote 属性 | dhcp.eth0 属性 | net.* 属性 )
  7. java 入门-helloWorld
  8. 【bzoj4916】神犇和蒟蒻 杜教筛
  9. PHP基本连接数据库
  10. 利用mk-table-checksum监测Mysql主从数据一致性操作记录