精华内容
下载资源
问答
  • C语言中全局变量、局部变量、静态全局变量、静态局部变量
    千次阅读
    2019-04-08 19:55:16

    1、从作用域看:

    1>全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。

    2>静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

    3>局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。

    4>静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

    2.从分配内存空间看:

    1>全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间

    2>全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

    1)静态变量会被放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。

    2)变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。

    从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。

    Tips:

    A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

    B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

    C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;

    D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)

    E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

     

    更多相关内容
  • } c语言局部变量 静态局部变量 全局变量与静态全局变量 基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 ...

    //test.c

    #include

    extern int global_var;

    void test_global_var()

    {

    global_var++;

    printf("global_var = %d\n", global_var);

    }

    #include

    #include

    #include

    void test_static_local_variable();

    int global_var = ; //普通全局变量,随着整个程序的结束而消亡。可以在整个程序方法问

    //可以在其他.c文件中访问

    static int static_global_var = ; //静态全局变量,限定只能在本文件内部访问

    int main(int argc, char** argv)

    {

    int a = ; //普通局部变量,只能在main函数内部使用,随着main函数的结束而消亡

    for (int i = ; i < a; i++) //复合语句中定义,随着for循环的结束而消亡

    {

    printf("i = %d\n", i);

    }

    test_static_local_variable(); //local_var = 1

    test_static_local_variable(); //local_var = 2

    test_static_local_variable(); //local_var = 3

    printf("global_var = %d\n", global_var); //global_var = 1

    test_global_var(); //global_var = 2

    test_global_var(); //global_var = 3

    system("pause");

    return ;

    }

    void test_static_local_variable()

    {

    static int local_var = ; //静态局部变量,只能在函数test_static_local_variable内部使用

    //生命周期为整个程序,随着程序的结束而消亡

    local_var++;

    printf("local_var = %d\n", local_var);

    }

    c语言局部变量 静态局部变量 全局变量与静态全局变量

    基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...

    C语言中全局变量、局部变量、静态全局变量、静态局部变量的区别 (转)

    1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域. 从作用域看: 1>全局变量具有全局 ...

    C&plus;&plus; 全局变量、局部变量、静态全局变量、静态局部变量的区别

    全局变量.局部变量.静态全局变量.静态局部变量的区别 C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作 ...

    静态局部变量、静态全局变量、extern全局变量、自动变量 札记

    静态局部变量 静态局部变量. 从称呼上我们可以看出,静态局部变量首先是一个局部变量,因此其只在定义它的函数内有效,冠以静态的头衔后,其生存期就被延长了,不会随着函数的返回而被撤销.我们可以这样来理解: ...

    PHP static静态局部变量和静态全局变量总结

    1.不会随着函数的调用和退出而发生变化,不过,尽管该变量还继续存在,但不能使用它.倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值 2.静态局部变量只会初始化一次 3.静态属 ...

    static静态全局变量和static静态局部变量

    static静态全局变量: 静态全局变量就是将全局变量变成静态的.如何变?——全局变量加个static. static就是一个存储类说明符,a这个全局变量就成了一个静态全局变量了. 静态全局变量的特点 ...

    static全局变量与普通全局变量的区别,static局部变量与普通局部变量的区别,static函数与普通函数的区别

    static全局变量与普通全局变量的区别 static全局变量和普通全局变量的存储方式没有不同,如果它们都已经初始化,那么存放在进程的数据段中,否则存放在bss段.这两者的不同点在于作用域不同,当一个 ...

    C&plus;&plus;静态全局变量和全局变量的区别

    静态全局变量 非静态全局变量 存储方式 静态存储 静态存储 作用域 定义该变量的源文件内 所有源文件 解释: 共同点:全局变量(外部变量)的说明之前再冠以static 就构 成了静态的全局变量.全 ...

    Shell 全局变量、环境变量和局部变量

    Shell 变量的作用域(Scope),就是 Shell 变量的有效范围(可以使用的范围). 在不同的作用域中,同名的变量不会相互干涉,就好像 A 班有个叫小明的同学,B 班也有个叫小明的同学,虽然他 ...

    随机推荐

    一台服务器发布多个tomcat并注册服务名办法

    修改服务名称 打开Tomcat7.0.65_1/bin/service.bat  修改注册服务名称 当然这个名字自己改 比如Tomcat7_2 原始文件:   set SERVICE_NAME=Tom ...

    &lbrack;tools&rsqb; Sublime text 3 神器

    同事给了一个Sublime text 3 增强优化版.

    Quartz CronTrigger最完整配置说明

    转:http://www.blogjava.net/xmatthew/archive/2009/02/15/253864.html   Quartz CronTrigger最完整配置说明 CronTr ...

    在centos 6&period;5 在virtual box 上 安装增强版工具

    centos 6.5 在virtual box 上 安装增强版工具: 出现:centos unable to find the source of your current linux kernel ...

    一款基于jQuery的支持鼠标拖拽滑动焦点图

    记得之前我们分享过一款jQuery全屏广告图片焦点图,图片切换效果还不错.今天我们要分享另外一款jQuery焦点图插件,它的特点是支持鼠标拖拽滑动,所以在移动设备上使用更加方便,你只要用手指滑动屏幕即 ...

    codevs1099字串变换(Bfs)

    /* 最少步数问题 妥妥的Bfs 很显然队列里存的是串(可能存个数也可以 就像8数码那样) 然后每次队首元素弄出来 能换的都换一遍 最后每次换完的新串入队前先判断到头了没 最后说一句 String大法 ...

    实现AOP功能的封装与配置的小框架

    内容 java基础巩固笔记 - 实现AOP功能的封装与配置的小框架 设计(目录): XXX = java.util.ArrayList中 代码 Advice接口 MyAdvice类 BeanFacto ...

    SqlServer变量

    MySql变量 => https://www.cnblogs.com/fanqisoft/p/10700669.html 全局变量 局部变量 ⒈全局变量 以@@开头,后面跟相应的字符串,全局变量 ...

    Maven(八)Eclipse创建Web项目(复杂方式)

    1. 生成标准的Web工程结构 2. 勾选结尾为webapp的包 3. 生成的文件结构如下 3.1 生成的目录结构若存在错误,缺少servlet.api 3.1.1 添加步骤如下 4.生成后存在的缺点 ...

    Datagridview 在基于文本的单元格中启用换行&comma;自动调整行高列宽

    将 DataGridViewCellStyle的 WrapMode 属性设置为 DataGridViewTriState 枚举值之一.下面的代码示例使用 System.Windows.Forms.Da ...

    展开全文
  • C语言的关键字static在有三个作用:声明静态函数,声明静态全局变量,声明静态局部变量声明静态函数在函数的返回类型前加个static,就是静态函数了。静态函数只能在声明它的文件中使用,其他文件看不到它。而不同的文件...

    欢迎关注VxWorks567
    如转发,请标明出处!

    C语言的关键字static在有三个作用:声明静态函数,声明静态全局变量,声明静态局部变量

    声明静态函数
        在函数的返回类型前加个static,就是静态函数了。静态函数只能在声明它的文件中使用,其他文件看不到它。而不同的文件可以使用相同名字的静态函数,互不影响。非静态函数可以在另一个文件中直接引用,甚至不必使用extern声明

    f003c42439756e93f18218575f8478b5.png

    声明静态全局变量
        全局变量定义在函数体外部,编译器会自动对其初始化。普通全局变量,对整个Kernel可见;而静态全局变量仅对当前文件可见,其他文件不可访问。因此,如果定义的全局变量(或函数)不需要与其他文件共享,建议加上static来降低程序之间的耦合。

    声明静态局部变量
        局部变量就是函数内部定义的变量,其作用域比全局变量小很多。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。而使用了static的静态局部变量,即使在声明时未赋初值,编译器也会把它初始化为0。而且静态局部变量的存储位置也不同,即使函数返回了,它的值也会保持不变

    ae3d32da774003d8578725003ffd5a95.png


    再看看使用static之后,对存储位置的影响。在VIP中声明不同位置的函数与变量

    fe1d1dba6040c9dfb660e493e8bd0d4b.png

    再把它们的地址与系统内存布局对比一下

    0cd4ed344a440f38d3b9a5155cc6afda.png

    得出以下结论:

    • 1 静态函数在Shell里不可见,全局函数在Shell里可见

    • 2 不管哪种函数,都存储于系统的文本段中

    • 3 有初值的全局变量(无论是否静态变量),以及有初值的静态局部变量,存储于系统的数据段中

    • 4 无初值的全局变量(无论是否静态变量),以及无初值的静态局部变量,存储于系统的BSS段中,被初始化为0

    • 5 局部变量(非静态,无论有无初值),存储于任务的栈中。如未赋初值,则使用0xeeeeeeee

    留两个问题:
    1这个0xeeeeeeee值是怎么来的
    2同样的代码,如果是动态加载的(例如使用DKM),那这些变量的地址又如何

    我是泰山,专注VX 15年!
    一起学习,共同进步!

    a46ab824c2b1c4b33516ee8835dd9a88.png

    展开全文
  • static作为C语言中的关键词,常用来修饰变量和函数。...2.局部静态变量:在局部变量前面加上关键词static,局部变量就被定义成一个局部静态变量。(1)内存中的位置:静态存储区。(全局变量在加上static修饰...

    static作为C语言中的关键词,常用来修饰变量和函数。

    static修饰的变量:

    1.全局静态变量:在全局变量前面加上关键词static,全局变量就被定义成一个全局静态变量。

    (1)内存中的位置:静态存储区。

    (2)作用域:在程序任何地方都是可见的。

    2.局部静态变量:在局部变量前面加上关键词static,局部变量就被定义成一个局部静态变量。

    (1)内存中的位置:静态存储区。(全局变量在加上static修饰后,它的存储位置由栈改为静态存储区)

    (2)作用域:只在函数内部可见。

    1ba63dd3358e0b933a73f5579bef7e11.png

    9c6678b414a3a67ebee3bc9b3cf295f3.png

    静态变量在初始化时均只初始化一次。静态全局变量和静态局部变量的不同:

    非静态全局变量的作用域是整个源程序,而静态全局变量限制了其作用域,即只在定义该变量的源文件有效,同一源程序的其他源文件整不能使用它。

    静态局部变量生存期为整个源程序,但只能在定义该变量的函数内使用。退出函数后就不能使用它。

    static声明的变量有以下特征:

    (1)变量会被放在程序的数据区,这样可以在下一次调用的时候还保持原来的赋值。

    (2)变量用static告知编译器,自己仅仅在变量的作用范围内可见,这是它与全局变量的区别。

    C语言中使用静态函数的好处;

    (1)静态函数会被自动分配在一个一直使用的存储区,直到退出程序,避免了调用函数的压栈出栈,速度快很多。

    (2)static指函数的作用域仅局限于本文件。不用担心自己定义的函数是否会与其他文件的函数同名。

    展开全文
  • 局部变量  普通的局部变量定义的时候直接定义或者在前面加上auto void func1(void) {  int i = 1;    i++;    printf("i = %d.\n", i); } 局部变量i的解析: 在连续三次调用func1中,每次调用时,...
  • 欢迎关注笔者,你的支持是持续更博的最大动力 ...非静态变量(一定是局部变量)地址每次函数调用时都可能不同,只在函数的一次执行期间不变 如果没明确初始化,则静态变量会被自动初始化成全0(每个bit都是0),.
  • 转自:全局变量、局部变量、静态全局变量、静态局部变量的区别 C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域。 从作用...
  • C语言中static静态变量

    千次阅读 2022-02-22 10:00:11
    静态变量的说明符是static static静态变量属于静态存储方式,其存储空间是 静态数据区(也就是存入全局存储区),静态数据区的数据在整个程序运行...所有全局变量都是静态变量,而局部变量只有定义时加上类型修饰符stat
  • 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。 从作用域看: 1>全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局...
  • 1、局部变量能否和全局变量重名?  答:能,局部会屏蔽全局。要用全局变量,需要使用 ":: "  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器...
  • 1.c语言-静态局部变量 1.1 测试代码 ( 静态局部变量的生命周期及作用域) void fun01_01_01(){ int a01_01=0; static int b01_01=0; a01_01++; b01_01++; printf("a01_01=%d ",a01_01); printf("b01_01=%d\...
  • 1. static 变量  静态变量的类型 说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。 例如外部变量虽属于静态 存储方式,但...(1)静态局部变量在函数内定义 它
  • 1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。...2>静态局部变量具有局部作用域
  • 1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。...2>局部变量也只有局部作用域,它是自动对象(a
  • 1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。要用全局变量,需要使用"::"局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同...
  • 局部变量、全局变量和静态变量之间的区别 (1)局部变量 定义: 在一个函数内部定义的变量是局部变量,它只在本函数范围内有效。 1.主函数main定义的变量也只在主函数有效; 2.不同函数中可以使用名字相同的变量,...
  • 一般全局变量存放在数据区,局部变量存放在栈区, 动态变量存放在堆区,函数代码放在代码区。 一般全局变量存放在数据区,局部变量存放在栈区, 动态变量存放在堆区,函数代码放在代码区。  ----------...
  • 变量与常量 ...局部变量:定义在函数中的变量。 全局变量 全局变量:定义在函数外面的变量。 #include<stdio.h> int g_a; //定义在函数外面叫全局变量 int main(void) { int a; ...
  • 用于存放局部变量 也就是说,任何函数里面,我们定义的变量,不加任何修饰,那么这些变量都是保持在栈区里的 静态全局区 未初始化的静态全局区 静态变量(static修饰的变量)或全局变量(在主函数外,不属于...
  • 从空间角度来看,变量可以分为全局变量和局部变量,而从时间角度来分的 可以有静态存储变量和动态存储变量之分。一。全局变量和局部变量1。局部变量他是指在函数内部定义的变量 作用域为定义局部变量的函数 也就是说...
  • C语言 static静态变量

    2018-01-01 17:43:00
    静态变量类型说明符是static。 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不...
  • 如何区分const char*p 和char* const p? 画一条垂直线穿过上述指针声明的星号位置,如果const出现在线的左边,指针指向的数据为常量;...静态变量和全局变量都储存在一个叫静态存储区的内存区域内。静态存储区与
  • 静态全局变量非静态全局变量的区别 在全局变量的说明之前再加以static 就构成了静态的全局变量。 全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。 这两者的区别:...
  • 1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种: 全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。...2>静态局部变量具有局部作用域,它只被初始化一
  • 全局变量,局部变量静态变量,动态变量。
  • 1】静态局部变量:在函数体内,被声明为静态的变量在函数被调用过程中维持其值不变,其值在下次调用时仍维持上次的值。(不被释放,而且只要赋一次初始值,如果没有赋值的话会自动为0.) (存储方式-生存期的改变) 2...
  • 一般的来说,函数是可以返回局部变量的。局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,811
精华内容 15,924
关键字:

非静态局部变量c语言