您的位置:首页 > 编程语言 > C语言/C++

C语言的数据存储

2017-04-18 18:41 253 查看


一、划分

   1、代码区:​存放编译后可执行代码的区域。

   2、静态存储区:存在着静态变量(static修饰的变量,如:static int a)​以及全局变量。全局变量和静态变量在分配内存时会被初始化器初始化为类型0。

   3、常量区:存放一些常量(如: char *p = “abcd”)且被认为是只可读的。​   

   4、栈区:存放函数的形参和局部变量(包括符合类型的局部变量), 例如在main函数中定义一个int a;   编译器就会在栈区分配4个字节给a。函数结束后局部变量会被销毁。

   5、堆区​:C语言中用malloc realloc calloc
函数分配的动态内存都在堆区,如 char *p=(char*)malloc(10);   则p为指针,是一个局部变量,在栈区。p所指向的地址为堆区动态分配的空间,堆区由操作系统进行管理(可以认为有一个空闲内存分配表)​。


二、动态存储方式与静态动态存储方式

  1>从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。
      静态存储方式:是指在程序运行期间分配固定的存储空间的方式。
      动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。
 ​2>说明
      (1)静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。
      (2)静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
      (3)如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。
      (4)对于动态存储方式一般为malloc、realloc、calloc来进行申请时进行的实时分配​。
      malloc函数--分配内存块,但是不对内存块进行初始化(高效)
      calloc函数--分配内存块,并且对内存块进行初始化(效率比malloc低)
      realloc函数--调整先前分配的内存块(需要两个参数,且只进行尾巴扩充和缩小,不影响原来数据)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息