精华内容
下载资源
问答
  • 静态变量存储在哪个区

    万次阅读 2019-06-26 22:40:35
    静态变量存储在__ A 全局 B 堆 C 栈 D 常量 参考答案:A 知识点 内存到底分几个? 1、栈(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。 2、堆(heap) — 一般由程序员...
    静态变量存储在__区 
    A 全局区 
    B 堆 
    C 栈 
    D 常量区
    

    参考答案:A


    知识点

    内存到底分几个区?

    1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。

    2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由os回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

    3、全局区(静态区)(static)—全局变量静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。

    4、文字常量区 — 常量字符串就是放在这里的。 程序结束后由系统释放。

    5、程序代码区 — 存放函数体的二进制代码

    展开全文
  • 按照变量的作用域(即从空间)角度分:可以分为全局变量和局部变量。按照变量的生存期(即从时间)角度分:可以分为静态...全局变量全部存放在静态存储区程序开始执行时给全局变量分配存储区,程序运行完毕就释...

    73e936d0d016ea1103893238f29ebec3.png

    按照变量的作用域(即从空间)角度分:可以分为全局变量和局部变量。

    按照变量的生存期(即从时间)角度分:可以分为静态存储方式和动态存储方式。静态存储方式:是指在程序运行期间分配固定的存储空间的方式。动态存储方式:是在程序运行期间根据按需分配进行动态的分配存储空间方式。

    用户存储空间可以分为程序区、静态存储区、动态存储区。全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序运行完毕就释放。程序执行时它们占据固定的内存单元,而不动态分配和释放。

    动态存储区存放以下数据:

    1) 函数参数形式;

    2) 自动变量(未加static声明的局部变量);

    3) 函数调用时的现场保护和返回地址。

    备注:在C语言中,函数和变量的双重属性贯穿始终:数据类型和数据存储类别。

    Auto变量:

    自动变量用关键字auto作存储类别声明。例如:

    int f(int a) /*定义f函数,a为参数*/

    {auto int b,c=3; /*定义b,c自动变量*/

    ……

    }

    a是形参,b,c是自动变量,对c赋初值3。执行完f函数后,自动释放a,b,c所占的存储单元。关键字auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。

    static声明局部变量:

    函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态局部变量”,用关键字static进行声明。

    对静态局部变量的说明:

    1) 态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。

    2) 静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

    3) 如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。

    register变量

    为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。

    说明:

    1) 只有局部自动变量和形式参数可以作为寄存器变量;

    2) 一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;

    3) 局部静态变量不能定义为寄存器变量。

    用extern声明外部变量

    外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。用extern声明外部变量,扩展程序文件中的作用域。

    int max(int x,int y)

    {int z;

    z=x>y?x:y;

    return(z);

    }

    main()

    {extern A,B;

    printf("%dn",max(A,B));

    }

    intA=13,B=-8;

    说明:在本程序文件的最后1行定义了外部变量A,B,但由于外部变量定义的位置在函数main之后,因此本来在main函数中不能引用外部变量A,B。现在我们在main函数中用extern对A和B进行“外部变量声明”,就可以从“声明”处起,合法地使用该外部变量A和B。

    e211793f6d7830ef4bf94c58eec51327.png
    展开全文
  • 变量存储方式不同会使变量的生存期不同,生存期表示了变量存在的时间。生存期和变量作用域是从时间和空间这两个不同的角度来描述变量的特性。静态存储变量通常是变量定义时就分配固定的存储单元并一直保持不变,...
    e923df78e7057aa7d3cfc6cd486a4ba7.png
    f660a48e03fefae69a98225b57ddeed9.png

    变量的存储类型

    存储类型是变量的属性之一,C++定义了4种变量的存储类型:auto变量、static变量、register变量、extern变量。

    1. 变量存储方式不同会使变量的生存期不同,生存期表示了变量存在的时间。生存期和变量作用域是从时间和空间这两个不同的角度来描述变量的特性。
    2. 静态存储变量通常是在变量定义时就分配固定的存储单元并一直保持不变,直至整个程序结束。
    3. 如全局变量,他们存放在静态存储区中。
    4. 动态存储变量是在程序执行过程中使用它时才分配存储单元,使用完毕立即将该存储单元释放。例:形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时才予以分配的,调用函数完毕立即释放,此类变量存放在动态存储区中。

    即:

    静态存储变量是一直存在的,动态存储变量则时而存在时而消失。

    8b2176578c15a01f20ae9ca831555987.png

    1.auto变量

    函数内未加存储类型说明的变量均视为自动变量,可省去关键字auto。

    {int i ,j ,k ;auto int i,j,k ; //等价的。}

    特点:

    1. 自动变量的作用域仅限定于定义该变量的个体内。在函数中定义的自动变量,只有在该函数内有效;在复合语句中定义的自动变量,只在该复合语句中有效。
    2. 自动变量属于动态存储方式。变量分配的内存是在栈中,当函数调用结束后,自动变量的值会被释放。同样,在复合语句中定义的自动变量,在退出复合语句后也不能再使用,否则将引起错误。
    3. 由于自动变量的作用域和生存期都局限于定义它的个体内(函数或复合语句内),因此不同的个体中允许使用同名的变量而不会混淆。即使在函数内定义的自动变量也可以与该函数内部的复合语句中定义的自动变量同名。
    cae5420981d1b01cc24b23e9ab6f3641.png

    实例: 输出不同生存期的变量值。

    #includeusing namespace std;void main(){auto int i,j,k;cout <>i>>j;k=i+j;if(i!=0&& j!=0){auto int k;k=i-j;cout<

    结果为:

    e220a4477321b03dadc0cc8f57f45e01.png

    注:

    可能会出现两个类型说明符组合无效的问题,这时把 auto 隐去即可。

    72a612a545ba2bed667edf54ddd5da2f.png

    2.static变量

    在声明变量时加关键字static,可以将变量声明为静态变量。静态局部变量的值在函数调用结束后不消失,静态全局变量只能在本源文件中使用。

    static int a,b ;static float x,y;static int a[3] ={0,1,2};

    静态变量属于静态存储方式。

    091fb332e51e58d91b366661e5867485.png

    特点:

    静态变量在函数内定义,在程序退出时释放,在程序整个运行期间都不释放,也就是说他的生存期为整个源程序。静态变量的作用域与自动变量相同,在函数内定义就在函数内使用,尽管该变量还继续存在,但不能使用它,如再次调用定义它的函数,他又可以继续使用。编译器会为静态局部变量赋予0值。

    实例:使用static变量实现累加。

    #includeusing namespace std ;int add(int x) {static int n=0; //静态变量n=n+x;return n;}void main(){int i ,j ,sum;cout<>i;cout << "the result is :"<

    结果为:

    3aea8e845844bb7cb0be08d4186b57e1.png

    3.register变量

    通常变量的值存放在内存中,当对一个变量频繁读写时,需要反复访问内存存储器,此时将花费大量的存取时间。为了提高效率,C++语言可以将变量声明为寄存器变量,这种变量僵局不变来那个的值存放在CPU中的寄存器中,使用时不需要访问内存,而直接从寄存器中读写。寄存器变量的声明符是register。

    0b7784bb6cb878bedb6550927faa584d.png

    注:

    寄存器变量属于动态存储方式。凡是需要采用静态存储方式的变量不能定义为寄存器变量。编译程序会自动决定哪个变量使用寄存器存储。register可以起到程序优化的作用。
    4430fd4b4d722105a9d21d7a8657d325.png

    4.extern变量

    在一个源文件中定义的变量和函数只能被本源文件中的函数调用,一个C++程序中会有许多源文件,可用extern变量使用非本源文件中的全局变量。

    C++提供了extern 关键字来解决这个问题。在使用其他源文件中的全局变量时,只需要在本源文件中使用extern关键字来声明这个变量即可。

    实例:在app.cpp源文件中定义全局变量a、b、c代码如下:

    int a , b; //外部变量定义char c ; // 外部变量定义void main(){cout <

    在app2.cpp源文件中要使用app.cpp中的全局变量 abc,代码如下:

    extern int a,b;//外部变量说明extern char c;//外部变量说明func(int x,y){cout<

    注:

    在app2.cpp源文件中,编译系统不再为全局变量a、b、c分配内存空间,而是改变全局变量a、b、c的值,在app2.cpp源文件中输出值也会发生变化。

    a6ab0eb90580663f7f9a67b522a90878.png

    本文部分内容参考至网络,如有错误,敬请指正,如有侵权,请联系修改,谢谢。

    展开全文
  • 静态变量或全局变量则静态存储区。结构体大小的计算:一般来说,结构体大小,不等于内部成员的大小之和。原则一:结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址...

    C++类和结构体,通过new/malloc的,一般都在上存储。

    他们和基本数据类型int,char等一样,具体在内存哪个区域看声明的区域:

    在函数内的局部变量,则在栈上;静态变量或全局变量则在静态存储区。

    结构体大小的计算:

    一般来说,结构体大小,不等于内部成员的大小之和。

    原则一:结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算)。

    #include<stdio.h>
    
    struct A{
    	char a;//1 
    	int b;//4
    	char c;//1
    	int* d;//8
    }; 
    
    int main(){
    	printf("%dn", sizeof(struct A));//24
    	return 0;
    }

    环境:win 64位,即机器读取内存,一次读取64位-8字节。

    首先,按照定义顺序,先放char a在地址0,char占一个字节;

    其次,存储int b,放在模4为空的第一个位置,即地址4,int占4个字节,地址编号4 5 6 7的内存空间都是Int b 的空间,变量a和b中间的地址为1 2 3的空间为填充占位;

    然后,存放char c,放在地址8,char占一个字节;

    最后,指针变量d,指针8个字节,找模8为空的第一个位置,地址0不行,地址8不行,地址16可以,因此地址16到23存放指针d,其中c和d之间的地址编号为9-15的为占位空间。

    sizeof(A)=24

    #include<stdio.h>
    
    struct A{
    	
    	char c;//1
    	char b;//1
    	int* d;//8
    	int a;//4
    
    }; 
    
    int main(){
    	printf("%dn", sizeof(struct A));//24
    	return 0;
    }

    按照上述计算,得到20,而程序输出24,由此引出原则2:

    原则二:在经过第一原则分析后,检查计算出的存储单元是否为所有元素中最宽的元素的长度的整数倍,是,则结束;若不是,则补齐为它的整数倍。

    最后放int a,需要补齐8个字节来对齐。

    总结:

    结构体大小未必等于成员大小的和;

    按照内存对齐,成员位置在模自己长度为0的第一个空位;

    最后,需要按照最宽成员进行内存补齐。

    因此,为了节省结构体所占内存空间:

    可以按照元素需要内存的大小排序,降序排序,

    并且同类型的尽量临近声明。

    #include<stdio.h>
    
    struct A{
    	int* d;//8
    	int a;//4
    	char c;//1
    	char b;//1
    }; 
    
    int main(){
    	printf("%dn", sizeof(struct A));//16
    	return 0;
    }
    展开全文
  • 01动态存储方式与静态存储方式1、静态存储方式是指...4、全局变量全部存放在静态存储区中,程序开始执行时给全局变量分配存储区,程序执行完毕就释放。5、动态存储区存放以下数据(1)函数形式参数。(2)函数中...
  • C语言运行时内存大致分为四个数据:常量、全局数据(静态区)、堆、栈常量 存储了未被作为初始化使用的字符串常量和 const 修饰的全局变量,特点是只能读不能写,受到操作系统运行时保护,强行修改会导致 ...
  • C++register寄存器变量变量除了数据类型以外,还有3...存储期,指变量在内存的存储期限。auto, static和register3种存储类别只能用于变量的定义语句中。auto char character1;//字符型自动变量函数内定义 static...
  • 一个变量的声明、定义包括存储...1 变量与常量C/C++程序里,参与计算的数据都是通过存放内存中不同类型的常量或者变量来表示的。变量是内存或寄存器中用一个标识符命名的存储单元,可以用来存储一个特定类型的...
  • 1、栈(stack):FIFO就是那些由编译器需要的时候分配,不需要的时候自动清除的变量存储区。里面的变量通常是局部变量、函数参数等。2、堆(heap):就是那些由new分配的内存块,它们的释放编译器不去管,由...
  • 1、栈(stack):FIFO就是那些由编译器需要的时候分配,不需要的时候自动清除的变量存储区。里面的变量通常是局部变量、函数参数等。2、堆(heap):就是那些由new分配的内存块,它们的释放编译器不去管,由...
  • 静态变量所引用的实例位于Java堆或运行时常量池。Java字节码与Native机器码不同,字节码是运行JVM这一平台上的,字节码被解释的过程中,具体的执行方式因JVM的不同实现而不同,但是对于JVM来说,它的各种不同...
  • 先说结论:JDK7以上版本,静态存储于定义类型的Class对象中,Class对象如同堆中其他对象一样,存在于GC堆中。再说一堆题外话:尽信书则不如无书,题主的疑惑我也有过,到底孰是孰非,还要靠论据来佐证,当各种文献...
  • 问题 I:"java 动态变量存储在 哪个区域?"回答:静态变量存放在栈空间。动态(非静态)变量存放在堆空间里。问题 II:"新生代和老年代分别做了什么东西?"回答:为了优化GC性能,特将堆化分成不同的代:新生代 Young ...
  • 静态变量具有全局变量的优势,又不会像全变量一样被滥用。C++中用于管理静态变量,就需要用到静态函数。C++中类的静态成员,属于类,也属于对象,但终归属于类。(比较绕,直接记做属于类)特点 共享 : static 成员...
  • C++中,内存分成5个,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器需要的时候分配,不需要的时候自动清楚的变量存储区。里面的变量通常是局部变量、函数参数等。 ...
  • 全局变量存放在静态存储区,位置是固定的。 局部变量在栈空间,栈地址是不固定的。 栈:就是那些由编译器需要的时候分配,不需要的时候自动清楚的变量存储区。里面的变量通常是局部变量、函数参数等。 堆:就是...
  •  C++中,内存分成5个,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。  栈,就是那些由编译器需要的时候分配,不需要的时候自动清楚的变量存储区。里面的变量通常是局部变量、函数参数...
  •  栈,就是那些由编译器需要的时候分配,不需要的时候自动清除的变量存储区。里面的变量通常是局部变量、函数参数等。  堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,...
  • JAVA中的方法存储在JVM的哪个区

    千次阅读 2020-04-09 01:38:14
    聊到JAVA中的方法,大多数人对于方法存储在方法还是栈(虚拟机栈)是很迷茫的。 其实方法是存在方法的 下面我们就细细说一下JVM中的 方法 VS 栈 方法:用于存储已被虚拟机加载的类信息、常量、静态变量...
  • 字符串常量到底存放在哪个存储区 2013年02月23日 16:57:57 若水三千你是一千 阅读数 40499更多 分类专栏: c语言 字符串常量,放在哪个存储区呢?是“自动存储区”还是“静态存储区”中? 比如: char *pstr=“hello...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 130
精华内容 52
关键字:

静态变量存储在哪个区