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. [Android] Handler源码解析 (Java层)
  2. 旧电脑怎么升级配置_旧电脑升级哪些配件效果最好?答案莫过于这3点!
  3. 二值图像的距离变换研究
  4. 鸿蒙os2.0系统什么时候,鸿蒙OS 2.0beta什么时候发布 鸿蒙OS2.0功能介绍
  5. webpack:js、css、es6装载与压缩配置-学习笔记
  6. Class的getResource与ClassLoader的getResource路径/问题
  7. 第五十四篇 Linux相关——远程连接SSH
  8. Java的多线程以及内存模型的知识点梳理,有想到过这些吗?
  9. 微软服务器离线补丁工具包,wsus offline update
  10. mysql查询删除重复数据
  11. php header 跳转 ie问题
  12. 神奇的Gamma函数(scipy)
  13. 黑苹果 无法运行xcode_Hackintosh (黑苹果) 折腾
  14. 计算机机房安全消防管理制度,机房消防安全管理制度
  15. 网络安全·网络入侵检测系统
  16. atomic的实现原理
  17. 杏花巷口,清香两拂袖
  18. wpt eclipse 使用指南
  19. 关于斐讯K2路由器 j.s9w.cc 劫持的问题。
  20. 【方法】Marvell 88W8801 WiFi模块创建能上网的热点

热门文章

  1. ASP.NET中常用到的27个函数集
  2. node-mongo封装
  3. hdu4415 不错的想法题
  4. visual studio 汇编 创建 项目
  5. 【Java 虚拟机原理】Class 字节码二进制文件分析 七 ( 局部变量表分析 )
  6. luogu P3378 【模板】堆
  7. unity游戏框架学习-框架结构
  8. 什么是面向对象(OOP)
  9. PHPstorm配置同步服务器文件
  10. Java三大特性之封装