静态存储区与全局变量

接下来说存储类说明符的第二个知识点——静态变量,它包括三种:全局变量/外部变量,静态全局变量,静态局部变量

非常重要!工作中必用。接近于底层的一个理解。

特点:

静态变量存储在静态区/静态全局区/静态存储区,因为内存区域分5个区:堆区,栈区,字符常量区,静态区,代码区。

这个内存区域有什么特点?我们知道栈区的特点是 :变量的申请与释放都是由操作系统帮我们管理的,而且变量的生命周期在它的作用域结束的时候,就放掉了。

静态存储区的特点:

1 静态存储区的变量/我们申请的空间 会自动初始化为0。不管是int a,你定义好了这个a之后,也不用去初始化,a里面的值就是0.你定义一个指针 int * p,p里面就是NULL. 你定义一个结构体,有多个成员,每个成员都是0.定义一个数组,数组的所有成员都被初始化为0.

2.生命周期与程序共存亡。

像栈区的局部变量,它的作用域就是这个变量所在的{}范围内,从它定义的这一行开始直到{}结束,这么一个区域。

而静态变量是与程序共存亡的,从它创建开始到软件关闭,这块空间才会释放。

3.静态存储区的静态变量在程序运行的时候,在加载资源阶段分配空间。

解释一下"加载资源阶段分配空间":一个程序执行入口是主函数,当软件一打开的时候,不会直接执行主函数的,是要加载一些资源,也就是软件要运行所必要的资源,加载到内存。

资源加载完了,软件运行的环境就相当于搭建好了,资源加载完了,开始执行主函数。

即使说静态变量定义在主函数里面了,这个变量依然是在程序加载的阶段申请空间。

全局变量 :

位置:写在全局的位置。?!

只要不在任何函数内,就叫 全局变量。

全局变量会自动初始化为0.

当然也可以手动初始化成 想要的值。

当全局变量与局部变量重名,在局部位置,局部变量有效。

原文地址:https://www.cnblogs.com/dabing0983/p/10568017.html

时间: 2024-10-27 22:01:01

静态存储区与全局变量的相关文章

C++局部变量、全局变量、静态变量(堆、栈、静态存储区)

1 static关键字 1.1 隐藏 eg: //a.c文件中 char a = 'A'; void msg() { printf("Hello\n"); } //main.c文件中 extern char a; printf("%c",a); 输出结果:A Hello 所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问.a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的. 如果加了stat

(转)C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

程序在内存有五个存在区域: A:动态区域中的栈区  B:动态区域中的栈区 C:静态区域中:全局变量 和静态变量    (这个区域又可以进一步细分为:初始化的全局变量和静态变量    以及    未初始化的全局变量和静态变量  ) D:静态区域中:文字 数字 常量 E:静态区域中:代码区(就是编译后的二进制代码  指导CPU怎么运行的玩意) ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× 栈,程

c++ 堆、栈、自由存储区、全局/静态存储区和常量存储区

在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等. 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收. 自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的.

C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

      栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样,用户栈在程序执行期间可以动态地扩展和收缩. 堆,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收.堆可以动态地扩展和收缩. 自由存储区,就是那些由 

转:计算机中栈区,堆区,静态存储区,文字常量存储区,代码区的详细解释

转:http://blog.csdn.net/dotneterbj/article/details/8021200 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事(数据结构中的堆是用数组模拟的),分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(

(转载)C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

C++内存分配方式详解--堆.栈.自由存储区.全局/静态存储区和常量存储区       栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样,用户栈在程序执行期间可以动态地扩展和收缩. 堆,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete.如果程序员没有释放掉,那么在程序结

栈,堆,静态存储区

1.栈是先入后出, 2.栈保存了一个函数调用所需的维护信息,函数参数,函数返回地址,局部变量,函数调用上下文.没有栈就没有函数,没有局部变量. 3. 栈保存了一个函数调用所需的维护信息(函数参数,函数返回值地址,局部变量,函数调用上下文) 4.栈上的数据在函数返回后就会被释放掉,无法传递到函数外部 5.堆是程序中一块巨大的内存空间,可由程序自由使用 6.堆中被程序申请使用的内存在程序主动释放前将一直有效 7.堆空间通过申请才能获得 8.系统对堆空间的管理方式(空闲链表法,位图法,对象池法等等)

常量字符串为什么位于静态存储区?

char *c="zhaobei";书上说: "zhaobei"这个字符串被当作常量而且被放置在此程序的内存静态区.那一般的int i=1;1也是常量,为什么1就不被放置在此程序的内存静态区了呢?请高手指点! 所有的字符窜常量都被放在静态内存区因为字符串常量很少需要修改,放在静态内存区会提高效率 例: char str1[] = "abc";char str2[] = "abc"; const char str3[] = &q

堆区、栈区和静态存储区详解

一.内存基本构成 可编程内存在基本上分为这样的几大部分:静态存储区.堆区和栈区.他们的功能不同,对他们使用方式也就不同. 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.它主要存放静态数据.全局数据和常量. 栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. 堆区:亦称动态内存分配.程序在运行的时候用malloc或new申请任意大小的内存,程