全局变量和静态局部变量有什么区别
C语言之静态变量
C语⾔之静态变量1、静态局部变量 有时候,我们希望函数中局部变量的值在函数调⽤结束之后不会消失,⽽仍然保留其原值。
即它所占⽤的存储单元不释放,在下⼀次调⽤该函数时,其局部变量的值仍然存在,也就是上⼀次函数调⽤结束时的值。
这时候,我们就应该将该局部变量⽤关键字 static 声明为“静态局部变量”。
当将局部变量声明为静态局部变量的时候,也就改变了局部变量的存储位置,即从原来的栈中存放改为静态存储区存放。
这让它看起来很像全局变量,其实静态局部变量与全局变量的主要区别就在于可见性,静态局部变量只在其被声明的代码块中是可见的。
对某些必须在调⽤之间保持局部变量的值的⼦程序⽽⾔,静态局部变量是特别重要的。
如果没有静态局部变量,则必须在这类函数中使⽤全局变量,由此也就打开了引⼊副作⽤的⼤门。
使⽤静态局部变量最好的⽰例就是实现统计次数的功能, 静态局部变量在内定义,但不象普通的那样,当来调⽤时就存在,退出时就消失。
静态始终存在着,也就是说它的为整个。
静态局部变量的虽然为整个,但是其仍与普通的相同,即只能在定义该变量的源内使⽤该变量。
退出该函数后,尽管该变量还继续存在,但不能使⽤它。
对基本类型的静态若在说明时未赋以初值,则系统⾃动赋予0值。
⽽对不赋初值,则其值是不定的。
根据静态的特点,可以看出它是⼀种为整个源⽂件的量。
虽然离开定义它的百函数后不能使⽤,但如再次调⽤定义它的函数时,它⼜可继续使⽤,⽽且保存了前次被调⽤后留下的值。
因此,当多次调⽤⼀个函数且要求在调⽤之间保留某些变量的值时,可考虑采⽤静态局部变量。
虽然⽤全局变量也可以达到上述⽬的,但全局变量有时会造成意外的副作⽤(尤其是短名全局变量的变量名污染很严重),因此仍以采⽤局部为宜。
简单的说静态局部变量与全局变量最明显的区别就在于:全局变量在其定义后所有函数都能⽤,但是静度态局部变量只能在⼀个函数⾥⾯⽤。
2、静态全局变量 在 C 语⾔中,static 关键字不仅可以⽤来修饰变量,还可以⽤来修饰函数。
static全局变量与普通的全局变量有什么区别
(1)用于全局变量:外部静态变量,只能在本源文件中被引用,不能被其它源文件所引用。
(2)用于局部变量:局部静态变量,在函数返回后存储单元不释放;下一次调用该函数时,该变量为上次函数返回时的值。
(3)用于函数:内部函数,只能被本源文件中的函数所调用,不能被其它源文件调用。
Static全局变量与普通的全局变量有什么区别:1.static全局变量只初使化一次,防止在其他文件单元中被引用;2.static局部变量只被初始化一次,下一次依据上一次结果值;3.static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝const关键字在C语言中用于声明”只读变量”,其值不可修改,但具有确定的数据类型。
C 编译器总是为其分配相应的存储单元。
在C++中,const关键字用于声明常量,C++编译器视具体情况决定是为其分配存储单元还是仅将其作为编译期间的常量。
在C++中,还可以修饰类的成员函数,不改变类中的数据成员.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
char * const p; //常量指针,p的值不可以修改char const * p;//指向常量的指针,指向的常量值不可以改const char *p; //和char const *pASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。
如果表达式不为0,则继续执行后面的语句。
这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了就终止程序以免导致严重后果,同时也便于查找错误。
例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序:const作用:修饰变量、修饰函数参数、修饰函数返回值三个作用。
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
1)const变量有数据类型,而宏常量没有数据类型。
static全局变量与普通的全局变量的区别详细解析
static全局变量与普通的全局变量的区别详细解析(1)static全局变量与普通的全局变量有什么区别?(2)static局部变量和普通局部变量有什么区别?(3)static函数与普通函数作⽤域有什么不同?(4)static函数与普通函数有什么区别?(1)static全局变量与普通的全局变量有什么区别?全局变量的说明之前再加以static 就构成了静态的全局变量。
全局变量本⾝就是静态存储⽅式,静态全局变量当然也是静态存储⽅式。
这两者在存储⽅式上并⽆不同。
这两者的区别虽在于⾮静态全局变量的作⽤域是整个源程序,当⼀个源程序由多个源⽂件组成时,⾮静态的全局变量在各个源⽂件中都是有效的。
⽽静态全局变量则限制了其作⽤域,即只在定义该变量的源⽂件内有效,在同⼀源程序的其它源⽂件中不能使⽤它。
由于静态全局变量的作⽤域局限于⼀个源⽂件内,只能为该源⽂件内的函数公⽤,因此可以避免在其它源⽂件中引起错误。
从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储⽅式即改变了它的⽣存期。
把全局变量改变为静态变量后是改变了它的作⽤域,限制了它的使⽤范围。
(2)static局部变量和普通局部变量有什么区别?static局部变量只被初始化⼀次,下⼀次依据上⼀次结果值;(3)static函数与普通函数作⽤域有什么不同点?仅在本⽂件。
只在当前源⽂件中使⽤的函数应该说明为内部函数(static),内部函数应该在当前源⽂件中说明和定义。
对于可在当前源⽂件以外使⽤的函数,应该在⼀个头⽂件中说明,要使⽤这些函数的源⽂件要包含这个头⽂件。
(4)static函数与普通函数有什么区别?static函数在内存中只有⼀份,普通函数在每个被调⽤中维持⼀份拷贝程序的局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存在于(堆)中。
静态变量,全局变量,局部变量的区别
For personal use only in study and research; not for commercial use静态变量,全局变量,局部变量的区别1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。
从作用域看:1>全局变量具有全局作用域。
全局变量只需在一个源文件中定义,就可以作用于所有的源文件。
当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。
2>静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
3>局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
4>静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static 关键字修饰过的变量具有文件作用域。
这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。
2.从分配内存空间看:1>全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间2>全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。
这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
局部变量、全局变量、堆、堆栈、静态和全局
局部变量、全局变量、堆、堆栈、静态和全局【】预备知识—程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分∙栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈。
∙堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
∙全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量、未初始化的静态变量在相邻的另一块区域。
- 程序结束后有系统释放∙文字常量区—常量字符串就是放在这里的。
程序结束后由系统释放∙程序代码区—存放函数体的二进制代码。
一个正常的程序在内存中通常分为程序段、数据端、堆栈三部分。
程序段里放着程序的机器码、只读数据,这个段通常是只读,对它的写操作是非法的。
数据段放的是程序中的静态数据。
动态数据则通过堆栈来存放。
在内存中,它们的位置如下:+------------------+ 内存低端| 程序段||------------------|| 数据段||------------------|| 堆栈|+------------------+ 内存高端堆栈是内存中的一个连续的块。
一个叫堆栈指针的寄存器(SP)指向堆栈的栈顶。
堆栈的底部是一个固定地址。
堆栈有一个特点就是,后进先出。
也就是说,后放入的数据第一个取出。
它支持两个操作,PUSH和POP。
PUSH是将数据放到栈的顶端,POP是将栈顶的数据取出。
在高级语言中,程序函数调用、函数中的临时变量都用到堆栈。
为什么呢?因为在调用一个函数时,我们需要对当前的操作进行保护,也为了函数执行后,程序可以正确的找到地方继续执行,所以参数的传递和返回值也用到了堆栈。
通常对局部变量的引用是通过给出它们对SP的偏移量来实现的。
另外还有一个基址指针(FP,在Intel芯片中是BP),许多编译器实际上是用它来引用本地变量和参数的。
static变量和static函数的各自的特点
static变量和static函数的各自的特点static变量大致分为三种用法一、用于局部变量中,成为静态局部变量. 静态局部变量有两个用法,记忆功能和全局生存期.二、用于全局变量,主要作用是限制此全局变量被其他的文件调用.三、用于类中的成员.表示这个成员是属于这个类但是不属于类中任意特定对象static 声明的变量在C语言中有两方面的特征:1、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。
这一点是它与堆栈变量和堆变量的区别。
2、变量用static告知编译器,自己仅仅在变量的作用范围内可见。
这一点是它与全局变量的区别。
Tips:A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static 变量(这样的函数被称为:带“内部存储器”功能的的函数)E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。
函数前加static使得函数成为静态函数。
但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。
使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
扩展分析:术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。
随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。
为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。
全局变量、局部变量与静态变量
全局变量、局部变量和静态变量区别变量是程序运行时在内存中所申请的存储单元,根据所要存储的数据大小,申请的内存单元数量是不同的。
当某个程序加载后,会在内存中占据三个区域,分别为代码段、堆栈段和数据段。
代码段用于存放程序的所有指令;堆栈段用于存放临时数据;而数据段则用于存放长期数据。
堆栈段和数据段都是用于存放数据的,也就是可以用于定义变量。
堆栈段存放的是临时数据,主要用于函数调用时的参数传递、寄存器保存以及局部变量的保存。
某个变量存放在其中的位置不确定,跟堆栈的使用情况有关,所有的非静态局部变量都是定义在堆栈段中。
由于每次进入函数时堆栈的使用情况不同,为某个局部变量所申请的内存单元位置是不同的。
例如:某程序有一个名为abc的函数,其中包含一个unsigned char类型的局部变量x。
当第一次调用abc函数时,堆栈的栈顶位置是1000(表示堆栈中还有1000个单元没有被使用),则x存放在堆栈内偏移地址为999单元中,当执行完abc后,堆栈的栈顶又恢复到之前的位置。
当第二次调用abc函数时,栈顶的位置可能不再是1000,存放x的单元也不再是上次的999号单元,原来存放在999号单元的内容与本次的x没有任何关系。
一句话,局部变量之所以不能将数据保留下来,就是因为其所申请的内存单元不是固定的位置。
而全局变量以及函数内部的静态变量,则是申请在数据段。
数据段在程序加载到内存后,就为每个全局变量和静态变量申请了固定的位置,一直到该程序结束之前,这些全局变量和静态变量所占据的位置都是固定的,它们的内容也就没有保留下来。
全局变量与静态变量都是占据固定位置,内容可以保留。
区别在于:程序的所有函数都可以访问全局变量,而只能定义某个静态变量的函数可以访问该静态变量,其它函数不能访问它。
全局变量、局部变量、静态全局变量、静态局部变量的区别
全局变量、局部变量、静态全局变量、静态局部变量的区别⼀、C++变量根据定义的位置的不同的⽣命周期,具有不同的作⽤域,作⽤域可分为6种:全局作⽤域,局部作⽤域,语句作⽤域,类作⽤域,命名空间作⽤域和⽂件作⽤域。
(1)从作⽤域看:1、全局变量具有全局作⽤域。
全局变量只需在⼀个源⽂件中定义,就可以作⽤于所有的源⽂件。
当然,其他不包含全局变量定义的源⽂件需要⽤extern 关键字再次声明这个全局变量。
2、静态局部变量具有局部作⽤域,它只被初始化⼀次,⾃从第⼀次被初始化直到程序运⾏结束都⼀直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,⽽静态局部变量只对定义⾃⼰的函数体始终可见。
3、局部变量也只有局部作⽤域,它是⾃动对象(auto),它在程序运⾏期间不是⼀直存在,⽽是只在函数执⾏期间存在,函数的⼀次调⽤执⾏结束后,变量被撤销,其所占⽤的内存也被收回。
4、静态全局变量也具有全局作⽤域,它与全局变量的区别在于如果程序包含多个⽂件的话,它作⽤于定义它的⽂件⾥,不能作⽤到其它⽂件⾥,即被static关键字修饰过的变量具有⽂件作⽤域。
这样即使两个不同的源⽂件都定义了相同名字的静态全局变量,它们也是不同的变量。
(2)从分配内存空间看:1、全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,⽽局部变量在栈⾥分配空间2、全局变量本⾝就是静态存储⽅式,静态全局变量当然也是静态存储⽅式。
这两者在存储⽅式上并⽆不同。
这两者的区别虽在于⾮静态全局变量的作⽤域是整个源程序,当⼀个源程序由多个源⽂件组成时,⾮静态的全局变量在各个源⽂件中都是有效的。
⽽静态全局变量则限制了其作⽤域,即只在定义该变量的源⽂件内有效,在同⼀源程序的其它源⽂件中不能使⽤它。
由于静态全局变量的作⽤域局限于⼀个源⽂件内,只能为该源⽂件内的函数公⽤,因此可以避免在其它源⽂件中引起错误。
1)静态变量会被放在程序的静态数据存储区(全局可见)中,这样可以在下⼀次调⽤的时候还可以保持原来的赋值。
局部变量和全局变量小结
局部变量和全局变量小结局部变量和全局变量小结局部变量局部变量也称为内部变量。
局部变量是在函数内作定义说明的。
其作用域仅限于函数内部,离开该函数后再使用这种变量是非法的。
局部变量从存储方式上可分为动态(auto)存储类型和静态(static)存储类型。
动态存储类型的局部变量都是动态的分配存储空间,数据存储在动态存储区(栈)中。
函数调用结束后自动释放,生存期是在声明该变量的函数执行过程。
静态存储类型的局部变量则是静态的分配存储空间,数据存储在静态存储区中。
在程序整个运行期间都不释放,生存期贯穿于程序运行的整个过程。
函数中的局部变量,如不专门声明为static存储类别,默认都是动态地分配存储空间的,我们在平时的声明变量的过程中auto都是默认省略的。
全局变量全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。
全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。
在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放;如果外部变量不在文件的开头定义,其有效作用域只限于定义处到文件终。
如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。
表示该变量是一个已经定义的外部变量。
有了此声明,就可以从“声明”处起,合法地使用该外部变量。
其有效作用域就被拓展到从这个文件extern声明处到文件结束。
如果在全局变量声明的时候,前面加上关键字static,那么其他文件就不能再访问和使用该变量,其有效作用域只限于定义处到文件终。
局部变量能否和全局变量重名局部变量能和全局变量重名,但是局部变量会屏蔽全局变量。
在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
局部变量和全局变量的区别
局部变量和全局变量的区别1.定义的位置不同:
局部变量定义在⽅法内部。
成员变量定义在⽅法的外部,直接在类中。
2.作⽤范围不同:
局部变量只有在⽅法当中才能使⽤,出了⽅法就不能⽤了。
成员变量在整个类中全都可以使⽤。
3.默认值不同:
局部变量没有默认值,如果想要使⽤,必须要⼿动进⾏赋值。
成员变量如果没有赋值会有默认值,规则和数组⼀样。
4.⽣命周期不同:
局部变量随着⽅法进栈⽽诞⽣,随着⽅法的出栈⽽消失。
成员变量随着对象的创建⽽诞⽣,随着对象被垃圾回收机制回收⽽消失。
局部变量与全局变量区别栈、堆和静态存储区的区别
从作用域看:全局变量具有全局作用域.全局变量只需在一个源文件中定义,就可以作用于所有地源文件.当然,其他不包括全局变量定义地源文件需要用关键字再次声明这个全局变量.个人收集整理勿做商业用途静态局部变量具有局部作用域.它只被初始化一次,自从第一次初始化直到程序与你新内阁结束都一直存在,他和全局变量地区别在于全局变量对所有地函数都是可见地,而静态局部变量只对定义自己地函数体始终可见.个人收集整理勿做商业用途局部变量也只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期间存在,函数地一次调用结束后,变量就被撤销,其所占用地内存也被收回.个人收集整理勿做商业用途静态全局变量也具有全局作用域,他与全局变量地区别在于如果程序包含多个文件地话,他作用于定义它地文件里,不能作用到其他文件里,即被关键字修饰过地变量具有文件作用域.这样即使两个不同地源文件都定义了相同地静态全局变量,他们也是不同地变量.个人收集整理勿做商业用途从分配内存空间看:全局变量、静态局部变量、静态全局变量都在静态存储区分配空间,而局部变量在栈分配空间.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式.这两者在存储方式上没有什么不同.区别在于非静态全局变量地作用域是整个源程序,当一个源程序由多个源文件组成时,非静态地全局变量在各个源文件中都是有效地.而静态全局变量则限制了其作用域,即只在定义该变量地源文件内有效,在同一源程序地其他源文件中不能使用它.由于静态全局变量地作用域局限于一个源文件内,只能为该源文件内地函数公用,因此可以避免在其他源文件中引起错误.个人收集整理勿做商业用途、静态变量会被放在程序地静态数据存储区里,这样可以在下一次调用地时候还可以保持原来地赋值.这一点是他与堆栈变量和堆变量地区别个人收集整理勿做商业用途、变量用告知编译器,自己仅仅在变量地作用域范围内可见.这一点是他与全局变量地区别.从以上分析可以看出,把局部变量改变为静态变量后是改变了他地存储方式,即改变了他地生存期.把全局变量改变为静态变量后是改变了他地作用域,限制了他地使用范围,因此这个说明符在不同地地方起地作用是不同地.个人收集整理勿做商业用途:、若全局变量仅在单个文件中访问,则可以讲这个变量修改为静态全局变量.、若全局变量仅在单个函数中使用,则可以将这个变量修改为该函数地静态局部变量.、全局变量、静态局部变量、静态全局变量都存放在静态数据存储区.、函数中必须要使用变量地情况:当某函数地返回值为指针类型时,则必须是地局部变量地地址作为返回值,若为类型,则返回为错指针.个人收集整理勿做商业用途个人收集整理勿做商业用途预备知识—程序地内存分配一个由编译地程序占用地内存分为以下几个部分栈区()—由编译器自动分配释放,存放函数地参数值,局部变量地值等.其操作方式类似于数据结构中地栈. 个人收集整理勿做商业用途堆区()—一般由程序员分配释放,若程序员不释放,程序结束时可能由回收 .注意它与数据结构中地堆是两回事,分配方式倒是类似于链表. 个人收集整理勿做商业用途全局区(静态区)()—,全局变量和静态变量地存储是放在一块地,初始化地全局变量和静态变量在一块区域,未初始化地全局变量、未初始化地静态变量在相邻地另一块区域. 程序结束后有系统释放个人收集整理勿做商业用途文字常量区—常量字符串就是放在这里地.程序结束后由系统释放程序代码区—存放函数体地二进制代码.一个正常地程序在内存中通常分为程序段、数据端、堆栈三部分.程序段里放着程序地机器码、只读数据,这个段通常是只读,对它地写操作是非法地.数据段放地是程序中地静态数据.动态数据则通过堆栈来存放.个人收集整理勿做商业用途在内存中,它们地位置如下:内存低端程序段数据段堆栈内存高端个人收集整理勿做商业用途堆栈是内存中地一个连续地块.一个叫堆栈指针地寄存器()指向堆栈地栈顶.堆栈地底部是一个固定地址.堆栈有一个特点就是,后进先出.也就是说,后放入地数据第一个取出.它支持两个操作,和.是将数据放到栈地顶端,是将栈顶地数据取出.在高级语言中,程序函数调用、函数中地临时变量都用到堆栈.为什么呢?因为在调用一个函数时,我们需要对当前地操作进行保护,也为了函数执行后,程序可以正确地找到地方继续执行,所以参数地传递和返回值也用到了堆栈.通常对局部变量地引用是通过给出它们对地偏移量来实现地.另外还有一个基址指针(,在芯片中是),许多编译器实际上是用它来引用本地变量和参数地.通常,参数地相对地偏移是正地,局部变量是负地.当程序中发生函数调用时,计算机做如下操作:首先把参数压入堆栈;然后保存指令寄存器()中地内容,做为返回地址();第三个放入堆栈地是基址寄存器();然后把当前地栈指针()拷贝到,做为新地基地址;最后为本地变量留出一定空间,把减去适当地数值.在函数体中定义地变量通常是在栈上,用, , 等分配内存地函数分配得到地就是在堆上.在所有函数体外定义地是全局量,加了修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义地变量表示在该文件中有效,不能到别地文件用;在函数体内定义地表示只在该函数体内有效.另外,函数中地""这样地字符串存放在常量区.对比:个人收集整理勿做商业用途性能栈:栈存在于中.栈是动态地,它地存储速度是第二快地.堆:堆位于中,是一个通用地内存池.所有地对象都存储在堆中.申请方式【栈】: 由系统自动分配. 例如,声明在函数中一个局部变量; 系统自动在栈中为开辟空间 .【堆】: 需要程序员自己申请,并指明大小,在中函数如( *)(); 在中用运算符如( *)(); 但是注意:、本身是在栈中地.申请后系统地响应栈【】:只要栈地剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出. 个人收集整理勿做商业用途堆【】:首先应该知道操作系统有一个记录空闲内存地址地链表,当系统收到程序地申请时,会遍历该链表,寻找第一个空间大于所申请空间地堆结点,然后将该结点从空闲结点链表中删除,并将该结点地空间分配给程序;另外,对于大多数系统,会在这块内存空间中地首地址处记录本次分配地大小,这样,代码中地语句才能正确地释放本内存空间.另外,由于找到地堆结点地大小不一定正好等于申请地大小,系统会自动地将多余地那部分重新放入空闲链表中.申请大小地限制栈【】:在下,栈是向低地址扩展地数据结构,是一块连续地内存地区域.这句话地意思是栈顶地地址和栈地最大容量是系统预先规定好地,在下,栈地大小是(也有地说是,总之是一个编译时就确定地常数),如果申请地空间超过栈地剩余空间时,将提示.因此,能从栈获得地空间较小. 个人收集整理勿做商业用途堆【】:堆是向高地址扩展地数据结构,是不连续地内存区域.这是由于系统是用链表来存储地空闲内存地址地,自然是不连续地,而链表地遍历方向是由低地址向高地址.堆地大小受限于计算机系统中有效地虚拟内存.由此可见,堆获得地空间比较灵活,也比较大.申请效率地比较栈【】:由系统自动分配,速度较快.但程序员是无法控制地. 个人收集整理勿做商业用途堆【】:是由分配地内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.另外,在下,最好地方式是用分配内存,他不是在堆,也不是在栈是直接在进程地地址空间中保留一快内存,虽然用起来最不方便.但是速度快,也最灵活.堆和栈中地存储内容栈【】:在函数调用时,第一个进栈地是主函数中后地下一条指令(函数调用语句地下一条可执行语句)地地址,然后是函数地各个参数,在大多数地编译器中,参数是由右往左入栈地,然后是函数中地局部变量.注意静态变量是不入栈地. 个人收集整理勿做商业用途当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存地地址,也就是主函数中地下一条指令,程序由该点继续运行.堆【】:一般是在堆地头部用一个字节存放堆地大小.堆中地具体内容有程序员安排.存取效率地比较[] "";* "";是在运行时刻赋值地;而是在编译时就确定地;但是,在以后地存取中,在栈上地数组比指针所指向地字符串(例如堆)快.比如:(){;[] "";* "";[];[];;}对应地汇编代码: [];[][]: [];[][][]第一种在读取时直接就把字符串中地元素读到寄存器中,而第二种则要先把指针值读到中,在根据读取字符,显然慢了.小结:堆和栈地区别可以用如下地比喻来看出:使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他地好处是快捷,但是自由度小.使用堆就象是自己动手做喜欢吃地菜肴,比较麻烦,但是比较符合自己地口味,而且自由度大.个人收集整理勿做商业用途。
C++全局变量、静态全局变量和静态局部变量的异同?能结合代码详细分析一下吗?谢谢-已...
C++全局变量、静态全局变量和静态局部变量的异同?能结合代码详细分析一下吗?谢谢-已...全局变量与静态全局变量的主要区别是:作用域不同.全局变量的作用域不仅在本文件中可以使用,在其他文件中也可以使用.但静态全局变量只能在本文件中使用.如假设在1.cpp里定义了一个全局变量int g_val=1;一个静态全局变量int s_val=2在2.cpp里可以正常使用g_val这个变量,但是不能访问s_val这个变量.//1.cpp#include<iostream>using namespace std;int g_val=1;static int s_val=2;int main(){return 0;}//2.cppextern int g_val;//要加extern关键字extern int s_val;//虽然这个也可引用void test(){g_val=0;s_val=3;//这里访问出错.}静态局部变量与一般局部变量的区别就是:生存期不同静态局部变量的生存期在程序运行期间都存在,下一次会引用上次访问的值.如#include<iostream>using namespace std;void fun(){int i=0;//下一次进来的时候这步仍执行,即i又变回0static int val=0;//只初始化一次,下一次进来这个函数的时候,val 的值是引用上次的值.而不是0val++;i++;cout<<"静态局部变量:"<<val<<endl;cout<<"一般局部变量:"<<i<<endl;}int main(){fun();fun();return 0;}。
全局变量和静态变量
c++和C的划分存储区有点不一样。大概可以分为下面5个:
全局/静态区。常量区。自由存储区(new的地方),堆栈(局部变量),堆(malloc)的地方。
其实我觉得自由存储和heap应该差不多。从这点看。全局和静态地方是一样的。可是不能
从这点就说这两个变量是一样的。最起码局部变量都是以静态存储方式存储的。但全局变量具有外部连接性,即同一工程中其它文件中的也可引用。而静态变量不具有外部连接性,即同一工程中其它文件中不可以引用。
局部变量,局部静态变量,全局变量,全局静态变量分别教学内容
局部变量,局部静态变量,全局变量,全局静态变量分别c++内存到底分几个区?一:1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。
其操作方式类似于数据结构中的栈。
2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由os回收。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
- 程序结束后有系统释放。
4、文字常量区—常量字符串就是放在这里的。
程序结束后由系统释放。
5、程序代码区—存放函数体的二进制代码。
二:1、栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。
里面的变量通常是局部变量、函数参数等。
2、堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。
如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
3、自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
4、全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的c语言中,全局变量又分为初始化的和未初始化的,在c++里面没有这个区分了,他们共同占用同一块内存区。
5、常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
三:1、bss是英文block started by symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。
bss段属于静态内存分配。
它的初始值也是由用户自己定义的连接定位文件所确定,用户应该将它定义在可读写的ram区内,源程序中使用malloc分配的内存就是这一块,它不是根据data大小确定,主要由程序中同时分配内存最大值所确定,不过如果超出了范围,也就是分配失败,可以等空间释放之后再分配。
静态变量与全局变量的区别
静态变量与全局变量的区别全局变量与静态变量static 声明的变量在C语⾔中有两⽅⾯的特征:1.变量被放在程序的全局存储区中,这样在下⼀次调⽤的时候还可以保持原来的赋值。
这⼀点是它与堆栈变量和堆变量的区别。
2.变量⽤static告知编译器,⾃⼰仅在变量的作⽤范围内可见。
这⼀点是它与全局变量的区别。
Tips:A.若全局变量仅在单个C⽂件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;C.设计和使⽤访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重⼊问题;D.如果我们需要⼀个可重⼊的函数,那么,我们⼀定要避免函数中使⽤static变量(这样的函数被称为:带“内部存储器”功能的的函数)E.函数中必须要使⽤static变量的情况:⽐如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。
函数前加static使得函数成为静态函数。
但此处“static”的含义不是指存储⽅式,⽽是指对函数的作⽤域仅局限于本⽂件(所以⼜称内部函数)。
使⽤内部函数的好处是:不同的⼈编写不同的函数时,不⽤担⼼⾃⼰定义的函数,是否会与其它⽂件中的函数同名。
扩展分析:术语static有着不寻常的历史。
起初,在C中引⼊关键字static是为了表⽰退出⼀个块后仍然存在的局部变量。
随后,static在C中有了第⼆种含义:⽤来表⽰不能被其它⽂件访问的全局变量和函数。
最后,C++重⽤了这个关键字,并赋予它与前⾯不同的第三种含义:表⽰属于⼀个类⽽不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。
全局变量、静态全局变量、静态局部变量和局部变量的区别变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。
按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。
c语言局部变量静态局部变量全局变量与静态全局变量
c语⾔局部变量静态局部变量全局变量与静态全局变量基本概念:作⽤域:起作⽤的区域,也就是可以⼯作的范围。
代码块:所谓代码块,就是⽤{}括起来的⼀段代码。
数据段:数据段存的是数,像全局变量就是存在数据段的代码段:存的是程序代码,⼀般是只读的。
栈(stack):先进后出。
C语⾔中局部变量就分配在栈中。
局部变量 普通的局部变量定义的时候直接定义或者在前⾯加上autovoid func1(void){int i = 1;i++;printf("i = %d.\n", i);}局部变量i的解析:在连续三次调⽤func1中,每次调⽤时,在进⼊函数func1后都会创造⼀个新的变量i,并且给它赋初值1,然后i++时加到2,然后printf输出时输出2.然后func1本次调⽤结束,结束时同时杀死本次创造的这个i。
这就是局部变量i的整个⽣命周期。
下次再调⽤该函数func1时,⼜会重新创造⼀个i,经历整个程序运算,最终在函数运⾏完退出时再次被杀死。
静态局部变量(static)静态局部变量定义时前⾯加static关键字。
总结:1、静态局部变量和普通局部变量不同。
静态局部变量也是定义在函数内部的,静态局部变量定义时前⾯要加static关键字来标识,静态局部变量所在的函数在多调⽤多次时,只有第⼀次才经历变量定义和初始化,以后多次在调⽤时不再定义和初始化,⽽是维持之前上⼀次调⽤时执⾏后这个变量的值。
本次接着来使⽤。
2、静态局部变量在第⼀次函数被调⽤时创造并初始化,但在函数退出时它不死亡,⽽是保持其值等待函数下⼀次被调⽤。
下次调⽤时不再重新创造和初始化该变量,⽽是直接⽤上⼀次留下的值为基础来进⾏操作。
3、静态局部变量的这种特性,和全局变量⾮常类似。
它们的相同点是都创造和初始化⼀次,以后调⽤时值保持上次的不变。
不同点在于作⽤域不同全局变量定义在函数外⾯的变量,就叫全局变量。
普通全局变量普通全局变量就是平时使⽤的,定义前不加任何修饰词。
局部变量、全局变量、堆、堆栈、静态和全局变量
局部变量、全局变量、堆、堆栈、静态和全局变量一般全局变量存放在数据区,局部变量存放在栈区,动态变量存放在堆区,函数代码放在代码区。
---------------------------------------------------------------栈区是普通的栈数据结构,遵循LIFO后进先出的规则,局部变量安排在那里是ASM时就规定的,这样可以在一个函数结束后平衡堆栈,操作简单,效率高堆(动态区)在这里应当叫堆栈(不要和数据结构中的堆搞混)是程序在编译时产生的一块用于产生动态内存分配使用的块,操作比较栈要麻烦许多,在分配时要判断最优的地址(防止产生无用的内存碎片(由于屡次的NEW和DELETE产生的夹在两块使用中内存中的空余小内存(不容易被分配))),分配和回收时的效率比栈低多了---------------------------------------------------------------栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而堆是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率>有一定降低。
栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。
不同堆分配的内存无法互相操作。
栈空间分静态分配和动态分配两种。
静态分配是编译器完成的,比如自动变量(auto)的分配。
动态分配由malloca函数完成。
栈的动态分配无需释放(是自动的),也就没有释放函数。
为可移植的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序结束时所有的数据空间都会被释放回系统,但是精确的申请内存/ 释放内存匹>配是良好程序的基本要素。
堆是程序员管理的,栈是系统管理的.另外关于静态和全局的一些问题:静态变量的特点:1、一次存储:静态局部变量只被初始化一次,下一次初始化根据上一次的结果值,有点类似于c++中类的静态成员变量,即无论该类型生成多少个实例对象,所有的对象共用一个静态变量,到这里就是无论这个函数调用多少次,该静态变量只初始化一次,并没有因为超出其生存期而被销毁,只是外部不可见而已,用个例子说明之:void fun1( int v ){static int value = v;static int value = v;}int main( int arc, char*args[ ]){fun1( 50 );fun1( 100 );}执行的结果是:value : 50 value : 50说明在第二次调用fun1( )时的初始化value的采用的是上一次value的值,value在静态区的存储空间并没有因为fun1( )的结束而被释放,即体现了一次存储;2、作用域限定:静态修饰的作用域限定功能同时体现在函数与变量上;a)对于函数而言,任何用static修饰的函数,其作用域仅为当前源文件,而对外部来说这个函数是不可见的,即只有和其在同一源文件中的函数才能调用这个静态函数;反过来说,如果一个函数仅仅被同一源文件中的其他函数调用,那么这个函数应该声明为静态的,这样做的好处在于:可以一定程度上的解决不同源文件之间函数的命名冲突问题;b)对于变量而言,static修饰的全局变量,只在当前源文件中有效,对外部不可见,外部文件不能够引用;顾名思义,全局变量是指能够在全局引用的变量,相对于局部变量的概念,也叫外部变量;同静态变量一样,全局变量位于静态数据区,全局变量一处定义,多处引用,用关键字“extern”引用“外部”的变量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
全局变量和静态局部变量有什么区别?
存储的地方是一样的,不同之处在于它们的作用域不同:
全局变量基本上在程序的任何地方都能被看到
而静态局部变量只能在其指定的范围内被使用
比如
int i ; // 全局变量
class C
{
public:
static int i_C; // 静态局部变量
}
void main()
{
i = 1; // 合法
i_C = 1; // 错误
C::i_C = 1; // 合法
C cc;
cc.i_C = 2; // 合法
}
2、
全局变量具有外部连接性,即同一工程中其它文件中的也可引用。
而静态变量不具有外部连接性,即同一工程中其它文件中不可以引用。
如:
//cpp1.cpp
extern int x=10;
static int y=5;
//cpp2.cpp
#include <iostream.h>
void main()
{
extern int x;
extern int y;
cout<<x<<endl;
cout<<y<<endl;
}
将这两个文件放在同一工程中,你发现每一文件单独编译能通过,但作为工程不能构成.exe 文件运行。
若将有关变量y的行注释后(或将static换成extern)就可以了。
这是因为静态变量的作用域在本文件内,不能扩充到其它文件。
其作用是当多人合作开发一个工程时,仅在自己的文件内使用的全局变量用静态变量不会与其他人用的变量相混淆,这就是标识符的一致性。
3、静态局部变量
在局部变量前加上“static”关键字,就成了静态局部变量。
静态局部变量存放在内存的全局数据区。
函数结束时,静态局部变量不会消失,每次该函数调用时,也不会为其重新分配空间。
它始终驻留在全局数据区,直到程序运行结束。
静态局部变量的初始化与全局变量类似.如果不为其显式初始化,则C++自动为其初始化为0。
静态局部变量与全局变量共享全局数据区,但静态局部变量只在定义它的函数中可见。
静态局部变量与局部变量在存储位置上不同,使得其存在的时限也不同,导致对这两者操作的运行结果也不同。
以下无正文
仅供个人用于学习、研究;不得用于商业用途。
For personal use only in study and research; not for commercial use.
仅供个人用于学习、研究;不得用于商业用途。
Nur für den persönlichen für Studien, Forschung, zu kommerziellen Zwecken verwendet werden.
Pour l 'étude et la recherche uniquement à des fins personnelles; pas à des fins commerciales.
仅供个人用于学习、研究;不得用于商业用途。
толькодля людей, которые используются для обучения, исследований и не должны использоваться в коммерческих целях.
For personal use only in study and research; not for commercial use。