Ⅰ 静态存储区
3个a不会冲突。
这里涉及几个方面的知识:
1. 全局变量和静态数据放在静态存储区,生命周期为从申请到程序退出。因此局部变量若定义为static,则存储在静态存储区,否则存储在函数的栈内,生命周期为本函数内。
2. 全局变量和局部变量的作用域,全局变量为从申请到整个程序结束,局部变量为从申请到本{}范围内。
3. 局部变量对全局变量的屏蔽。若在本函数内定义的变量与全局变量同名,则将全局变量屏蔽,使用时为内部定义的局部变量。
4. 定义为static类型的局部变量,再次进入该函数,可以使用保留的结果。
下面的程序可以帮助理解:
#include<stdio.h>
int a = 1;
void fun()
{
static int a =3;
int b = 1;
printf("%d, %d\n", a, b);
a++;
b++;
}
int main()
{
printf("%d\n", a); /* global a */
static int a = 2;
printf("%d\n", a); /* static a in main */
fun(); /* static a in fun */
fun(); /* static a in fun */
return 0;
}
运行结果为:
1 /* 全局变量a */
2 /* 因为定义了main内的局部变量static int a,全局变量a被屏蔽,打印的为main局部变量a */
3, 1 /* 因为定义了fun内的局部变量static int a,全局变量a被屏蔽,打印的为fun内的局部变量a。 b是局部变量,打印为1 */
4, 1 /* 因为static的生命周期为整个程序,再次进入fun是a的值可以被保留,再次调用打印的值编程了3+1=4。b因为是在栈内,函数退出后空间被释放,再次进入是重新申请的空间,结果仍为新初始化的值1 */
Ⅱ c语言的内存变量
存储类别指的是数据在内存中存储的方法。存储方法分为静态存储和动态存储两大类。标准C语言为变量、常量和函数定义了4种存储类型:extern、auto、static、register。根据变量的存储类别,可以知道变量的作用域和存储期。这4种存储类型可分为两种生存期限:永久的(在整个程序执行期都存在)和临时的(暂时保存在堆栈和寄存器中)。extern和static用来标识永久生存期限的“变量和函数”,而anto和register用来标识临时生存期限的"变量"。只有变量才有临时生存期限。一个变量和函数只能具有一个存储类型,也只能有一种生存期限。
内存中供用户使用的空间有三部分:
程序区:存放程序的可执行代码;
静态存储区:存放静态变量(全局变量和静态局部变量);
动态存储区:存放函数调用时调用函数的现场保护和返回地址、函数形参、自动局部变量;
变量的声明分为”定义性声明“(需建立存储空间,如:int a;)和”引用性声明“(不需建立存储空间,如extern a;)。广义上讲,声明包括定义,一般为叙述方便,把建立存储空间的声明称定义,而不不需建立存储空间的声明称声明。
auto
函数中的局部变量,如果不用关键字static加以声明,编译系统对它们是动态地分配存储空间的。函数的形参和在函数中定义的变量(包括在复合语句中定义的变量)都属此类。在调用该函数时,系统给形参和函数中定义的变量分配存储空间,数据存储在动态存储区中。在函数调用结束时就自动释放这些空间。如果是在复合语句中定义的变量,则在变量定义时分配存储空间,在复合语句结束时自动释放空间。因此这类局部变量称为自动变量(auto variable)。自动变量用关键字auto作存储类别的声明。
对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行。对自动变量来说,若不赋初值,则它的值是一个不确定的值。
Ⅲ 常量存储区和静态存储区有什么区别 static const int a=10;是存到常量存储区还是静态存储区
如楼上所说,常量存储区里面的数据是放在代码段里的,不占内存。静态存储区是在内存空间中的,在其所属的类(或文件)中是全局的。
c语言中const好像没有用处。
static const int a=10;我个人认为是存到静态区的。你可以上网搜一下static const修饰的变量是如何赋初值的,一般有两种方法。一是定义时直接赋初值,二是类外赋初值。而常量是无法用这两种方法赋初值的。
Ⅳ 什么是静态存储区和动态存储区啊
1. 全局变量和静态数据放在静态存储区,生命周期为从申请到程序退出。因此局部变量若定义为static,则存储在静态存储区,否则存储在函数的栈内,生命周期为本函数内。
2 动态存储放自动变量和局部变量
Ⅳ C语言动态和静态存储类别的区别
主要区别在于存储区域和作用时间。
C语言的数据区分为静态存储区与动态存储区。
静态存储是指在程序运行期间给变量分配固定存储空间的方式。如全局变量存放在静态存储区中,程序运行时分配空间,程序运行完释放。
动态存储是指在程序运行时根据实际需要动态分配存储空间的方式。如形式参数存放在动态存储区中,在函数调用时分配空间,调用完成释放。
Ⅵ 手机取证的取证源
在手机取证的过程中 ,第一步的工作是从手机各 个相关证据源中获取有线索价值的电子证据 。手机 的 SIM 卡、内存、外置存储卡和移动网络运营商的业 务数据库一同构成了手机取证中的重要证据源。
1. 1 SIM 卡
在移动通信网络中 , 手机与 SIM 卡共同构成移 动通信终端设备。 SIM ( Sub sc ribe Iden tity Mo le ) 卡 即为客户识别模块 ,它也被称为用户身份识别卡。移 动通信网络通过此卡来对用户身份进行鉴别 ,并且同 时对用户通话时的语音信息进行加密。目前 , 常见 SIM 卡的存储容量有 8 kB、16 kB、32 kB 和 64 kB 这几 种 。从内容上看 , SIM 卡中所存储的数据信息大致可分为五类 :
( 1) SIM 卡生产厂商存储的产品原始数据 。
( 2)手机存储的固有信息 , 主要包括各种鉴权和加密信 息 、GSIM 的 IM S I码 、CDMA 的 M IN 码 、IM S I认证算法 、加密密匙生成算法 。
( 3 )在手机使用过程中存储的个人数据 ,如短消息 、电话 薄 、行程表和通话记录信息 。
( 4 )移动网络方面的数据中包括用户在使用 SIM 卡过程 中自动存入和更新的网络服务和用户信息数据 ,如设置的周 期性位置更新间隔时间和最近一次位置登记时手机所在位置 识别号 。
( 5 )其它的相关手机参数 , 其中包括个人身份识别号
( P IN ) ,以及解开锁定用的个人解锁号 ( PU K)等信息 。
1. 2 手机内 /外置存储卡
随着手机功能的增强 ,手机内置的存储芯片容量 呈现不断扩充的趋势。手机内存根据存储数据的差
异可分为动态存储区和静态存储区两部分 (见图 1 ) 。 动态存储区中主要存储执行操作系统指令和用户应 用程序时产生的临时数据 ,而静态存储区保存着操作 系统、各种配置数据以及一些用户个人数据。
图1 手机内存结构图
从手机调查取证的角度来看,静态存储区中的数据往往具有更大的证据价值。GSIM 手机识别号IMEI、CDMA 手机识别号ESN、电话薄资料、收发与编辑的短信息,主/被叫通话记录、手机的铃声、日期时间以及网络设置等数据都可在此存储区中获取。但是在不同的手机和移动网络中,这些数据在读取方式和内容格式上会有差异 。另外,为了满足人们对于手机功能的个性化需求,许多品牌型号的手机都提供了外置存储卡来扩充存储容量。当前市面上常见的外置存储卡有SD、MiniSD和Memory Stick。外置存储卡在处理涉及版权或着作权的案件时是一个重要的证据来源 。
1. 3 移动网络运营商
移动网络运营商的通话数据记录数据库与用户注册信息数据库存储着大量的潜在证据。通话数据记录数据库中的一条记录信息包括有主/被叫用户的手机号码、主/被叫手机的IMEI号、通话时长 、服务类型和通话过程中起始端与终止端网络服务基站信息。 另外 ,在用户注册信息数据库中还可获取包括用户姓名、证件号码 、住址、手机号码、SIM 卡号及其 P IN 和PU K、IM S I号和所开通的服务类型信息。在我国即将 实行“手机实名制 ”的大环境下 ,这些信息可在日后案件调查取证过程中发挥巨大的实质性作用。
Ⅶ 计算机内存中存放的都是些什么数据呢程序变量吗
内存存放的数据分几个区,不仅是存变量那么简单,如下:
1、栈区(stack):由编译器自动分配和释放
,存放函数的参数值、局部变量的值等,甚至函数的调用过程都是用栈来完成。其操作方式类似于数据结构中的栈
2、堆区(heap)
:一般由程序员手动申请以及释放,
若程序员不释放,程序结束时可能由OS回收
。注意它与数据结构中的堆是两回事,分配方式类似于链表
3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,
未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放空间
4、文字常量区:常量字符串就是放在这里的。
程序结束后由系统释放空间
5、程序代码区:存放函数体的二进制代码
Ⅷ 什么 是静态内存区
从C程序运行的角度看,内存几大部分:静态存储区、堆区和栈区。静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。
Ⅸ c++全局/静态存储区和常量存储区是一样的吗
当然不一样,下面详细讲解一下内存分配的几个区:
栈:
就是那些由编译器在需要的时候分配,
在不需要的时候自动清除的变量的存储区。
里面的变量通常是局部变量、函数参数等。
在一个进程中,位于用户虚拟地址空间顶部
的是用户栈,编译器用它来实现函数的调用。
和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。
堆:
就是那些由new分配的内存块,他们的释放编译器不去管,
由我们的应用程序去控制,一般一个new就要对应一个delete。
如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
堆可以动态地扩展和收缩。
自由存储区,
就是那些由malloc等分配的内存块,他和堆是十分相似的,
不过它是用free来结束自己的生命的。
全局/静态存储区,
全局变量和静态变量被分配到同一块内存中,
在以前的C语言中,全局变量又分为初始化的
和未初始化的(初始化的全局变量和静态变量在一块区域,
未初始化的全局变量与静态变量在相邻的另一块区域,
同时未被初始化的对象存储区可以通过void*来访问和操纵,
程序结束后由系统自行释放),在C++里面没有这个区分了,
他们共同占用同一块内存区。
常量存储区,
这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
Ⅹ 动态和静态存储区中数据的初始化有什么不同
c语言中需要内存来存放数据。而内存主要分为两类:静态存储区和动态存储区;
1.静态存储区分为:只读数据(READONLY DATA)区、以读写数据(RW DATA)区、未初始化区(BSS)。它们都是在程序编译连接阶段确定的,在程序执行的阶段不会改变。
2.动态存储区分为堆和栈。都是程序执行的过程中动态分配的,大小也随之动态变化。从内存管理的实现的角度看来,堆使用的链表实现的,而栈使用的是线性存储的方法。
栈:栈是先进后出,实际的操作中,栈内存可以有满栈和空栈的情况,满栈的情况下,栈指针当前的位子是已经使用的的栈区域;空栈的情况是,栈指针当前的位子是没有使用的栈区域,所以两种情况的出入栈,指针和数据的操作先后顺序是不同的。
满栈时:入栈,是先移动指针,在放入数据;出栈则是先出数据,在移动指针;
空栈时:入栈,是先放入数据,在移动指针。出栈则是先移动指针,在出数据;
C语言必须注意的几个问题:
1.内存泄露:申请一块内存,但没有释放,程序结束也没回收,导致其他程序不能使用
2.野指针:指一个内存指针已经被释放free或者realloc,但指针依然在使用。避免野指针的情况,将内存的指针置为NULL,并在程序使用的时候判断该内存是否为NULL,如为空,则认为该内存已经释放,不对内存进行访问。
3.非法释放内存:原则上讲只有被malloc(),calloc()或realloc()分配并通过返回值返回返回的内存才能被释放,否则释放除此以外的内存都是非法的。即使有一个指针是*p是malloc,那么对p1=p++,这个时候free(p1)也是不合法的,但free(p)确实可以的。同样释放函数中的局部变量也是非法的.还有一种情况是,对一个堆内存释放两次也是错误的用法。因为free()函数是不能释放未分配的堆内存。在程序使用free释放内存之后,应该将指针置为NULL,free一个NULL地址是没有问题的。