一. 在c中分为这几个存储区:栈(stack),堆(heap),代码段(text),数据段(data),bss 段,常量存储区,
1.栈(stack):由编译器自动分配释放
自动分配,自动回收:栈区里面存放的是局部变量;在定义局部变量的时候,系统在栈区自动分配内存,在结束时,自动回收内存;
脏内存:栈区每次使用之前需要对栈区进行初始化;对于定义局部变量时,需要对局部变量进行初始化;
临时性:(函数不能返回栈变量的指针,因为这个空间是临时的)
反复使用:栈内存在程序中其实就是那一块空间,程序反复使用这一块空间。
栈的大小有限,因此 会出现栈溢出

2.堆(heap): 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
手动分配:malloc分配内存,free进行释放内存;
脏内存:堆区每次使用之前呢需要对堆区进行初始化;
临时性:堆区每次分配的内存释放之后,就不能在使用;
malloc的使用:malloc每次分配的内存之后需要进行对其返回指针为void *类型,需要进行强制类型转换,并对返回指针进行检查是否为null;
malloc和free为c语言的标准库函数,不能分配对象;
内存泄漏;
gcc中的malloc默认最小是以16B为分配单元的;如果malloc小于16B的大小时都会返 回一个16字节的大小的内存。

3.代码段(text):

  也叫文本段,代码段其实就是函数编译后生成的东西;

4.数据段(data):

  也被称为数据区、静态数据区、静态区;
c语言中
1.显示初始化为非零全局变量,
2.显示初始化为非零的静态局部变量存储在这个段;

5.bss 段(又叫:ZI(zero initial)段):.bss 段
c语言中
1).显示初始化为0的全局变量;

2).未初始化的全局变量存储在这个段。--零初始化段;

3).显示初始化为0的static局部变量;

4).未初始化的static局部变量存储在这个段;

6.自定义段:

  段名由程序员自己定义,段的属性和特征也由程序员自己定义。

7.常量存储区:

  一块比较特殊的存储区,存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)

8.文件映射区:

  进程打开了文件后,将这个文件的内容从硬盘读到进程的文件映射区,以后就直接在内存中操作这个 文件,读写完了后在保存时再将内存中的文件写到硬盘中去。

9.内核映射区:

  内核映射区就是将操作系统内核程序映射到这个区域了。

10.不同的存储方式有不同的特点,简单总结如下:
1)函数内部临时使用,出了函数不会用到,就定义局部变量
2)堆内存和数据段几乎拥有完全相同的属性,大部分时候是可以完全替换的。

  生命周期不一样:

    堆内存的生命周期是从malloc开始到free结束;

    全局变量是从整个程序一开始执行就开始,直到整个程序结束才会消灭,伴随程序运行的一生。

  启示:如果变量只是在程序的一个阶段有用,用完就不用了,就适合用堆内存;

     如果这个变量本身和程序是一生相伴的,那就适合用全局变量。

补充1:
1)所有未初始化的静态(static)变量和全局变量,编译器会默认赋初值0。
2)程序在加载到内存前,代码区(text)和全局区(data和bss)的大小就是固定的,程序运行期间不能改变。
3)data段和bss区中的数据的生存周期为整个程序运行过程。
4)data段、text区和bss区是由编译器在编译时分配的,堆和栈是由系统在运行时分配的。

12.生命周期/作用域:
1).生命周期:指变量活着或者说是存在的时间;
2).作用域:指可以使用这个变量的范围;

结合示例详解:

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h> int c = ;        //初始化为非零的全局变量:.data段
int a = ;           //初始化为0的全局变量:.bss段
char *p1;            //未初始化的全局变量:.bss段
void main()
{
  int b;            //局部变量:stack(栈)
  char s[] = "abc";     //局部变量:stack(栈)
  char *p2;          //局部变量:stack(栈)
  char *p3 = "";    //字符串"123456"在常量区,p3局部变量:stack(栈)
  static int c = ;      //显示初始化的局部变量:.bss段
  p1 = (char *)malloc(); //malloc分配的内存:heap(堆)
  strcpy(p1, "");   system("pause");
  return;
}

补充2:

明确区分堆与栈:
在bbs上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。
首先,我们举一个例子:

void func()
{
int* p=new int[]; //包含了堆与栈
}

new分配了一块堆内存;
局部变量指针变量p分配的是一块栈内存;
意义:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中。

C中存储分区详解的更多相关文章

  1. oracle表分区详解

    原文来自:http://www.cnblogs.com/leiOOlei/archive/2012/06/08/2541306.html oracle表分区详解 从以下几个方面来整理关于分区表的概念及 ...

  2. SQL Server表分区详解

    原文:SQL Server表分区详解 什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆 ...

  3. Liunx中fstab文件详解

    Liunx中fstab文件详解 /etc/fstab是用来存放文件系统的静态信息的文件.位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc ...

  4. Fdisk 分区详解

    Fdisk 分区详解 来源 http://blog.itpub.net/20674423/viewspace-722812/ 1.             通过Fdisk查看系统分区详细信息: Fdi ...

  5. php中关于引用(&)详解

    php中关于引用(&)详解 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的变量名访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的 ...

  6. 【转载】C/C++中extern关键字详解

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  7. oracle中imp命令详解 .

    转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...

  8. linux下磁盘分区详解 图文(fdisk;mkfs)

    linux分区不同于windows,linux下硬盘设备名为(IDE硬盘为hdx(x为从a-d)因为IDE硬盘最多四个,SCSI,SATA,USB硬盘为sdx(x为a-z)),硬盘主分区最多为4个,不 ...

  9. MySQL数据库的各种存储引擎详解

    原文来自:MySQL数据库的各种存储引擎详解   MySQL有多种存储引擎,每种存储引擎有各自的优缺点,大家可以择优选择使用: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB ...

随机推荐

  1. 【R】多元线性回归

    R中的线性回归函数比较简单,就是lm(),比较复杂的是对线性模型的诊断和调整.这里结合Statistical Learning和杜克大学的Data Analysis and Statistical I ...

  2. hdu 2616 Kill the monster (DFS)

    Kill the monster Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. ubuntu服务器环境配置参考

    一.基本的Linux系统命令: ls 查看当前目录下的文件及文件夹 cd /var/www/html 转换目录到/var/www/html cd abc/ddd/ 转换目录到当前目录下的abc文件夹下 ...

  4. chrome性能指标(TTFB,TTSR,TTDC,TTFL)

    1.TTFB (Time To First Byte) 是最初的网络请求被发起到从服务器接收到第一个字节这段时间,它包含了 TCP连接时间,发送HTTP请求时间和获得响应消息第一个字节的时间. 注意: ...

  5. git项目初始化的问题汇总

    转:https://blog.csdn.net/Free_Wind22/article/details/81628721 1.在Git官网上点击New repository新建项目: 2.在本地新建一 ...

  6. 2.LXC和namespace介绍

    lxc介绍 LXC又名Linux container,是一种虚拟化的解决方案,这种是内核级的虚拟化.(主流的解决方案Xen ,KVM, LXC) Linux Container容器是一种内核虚拟化技术 ...

  7. Android键盘面板冲突 布局闪动处理方案

    转:来自Android键盘面板冲突 布局闪动处理方案 起源,之前在微信工作的时候,为了给用户带来更好的基础体验,做了很多尝试,踩了很多输入法的坑,特别是动态调整键盘高度,二级页面是透明背景,魅族早期的 ...

  8. oracle odbc 驱动安装(不安装oracle客户端)

    1.下载odbc驱动 需要下载两个东西 instantclient-basiclite-nt-12.1.0.1.0.zip instantclient-odbc-nt-12.1.0.1.0.zip 由 ...

  9. Centos 查看进程的几条命令

    1. ps -ef | grep java 表示查看所有进程里 CMD 是 java 的进程信息 2. ps -aux | grep java -aux 显示所有状态 3. kill -9 [PID] ...

  10. POJ 2226.Muddy Fields-二分图最大匹配(最小点覆盖)

    Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12565   Accepted: 4651 Des ...