在linux中,进程在内存中一般会分为5个段,用来存放从磁盘载入的程序代码,等.

这五个段分别是:

BSS段:

通常用来存放程序中未初始化的全局变量的一块内存区域.属于静态内存分配.

问题:全局变量不都是默认被初始化为0吗?

(data)数据段:

通常是指用来存放程序中已初始化的全局变量的一块内存区域.数据段属于静态内存分配.

(text)代码段:

通常指用来存放程序执行代码的一块内存区域.这部分区域在程序运行前就已经确定,并且内存区域通常属于只读.(某些架构也允许代码段可写),在代码段中也有可能存在一些只读常量,如只读的字符串等.

(heap)堆:

堆是用来存放进程运行中被动态分配的内存段,它的大小不固定,可动态扩张或缩减.当进程调用malloc分配内存时,就是从堆中分配,当free内存时,堆中去除此内存

(stack)栈:

用户存放程序临时创建的局部变量,也叫自动变量.此外,函数被调用时,参数也被压入发起调用的进程栈中,调用结束后,函数返回值也被存放回栈中.由于栈先进先出特点,所以栈适合用来保存/恢复调用现场.即我们可以把栈看成一个寄存,交换临时数据的内存区.

实例分析

#include <stdio.h>
#include <stdlib.h>

int outa=5;
int outb;
struct try{
int haha;
char heihei;
};
struct try *try_1=NULL;

int main(int argc, char *argv[])
{
        char *a="haha12345678";
        int b=0xa5;
        static int in_s_a=567;
        try_1=(struct try*)malloc(sizeof(struct try));

printf("\taddress_in_a=0x%x,\n  \
                \r\taddress_a=0x%x,\n   \
                \r\taddress_b=0x%x,\n   \
                \r\taddress_outa=0x%x,\n\
                \r\taddress_outb=0x%x,\n\
                \r\taddress_malloc_try_1=0x%x,\n\
                \r\taddress_main=0x%x,\n",
                &in_s_a,&a,&b,&outa,&outb,&try_1,&main);
        return 0;
}

编译:

gcc hello.c

运行:

./a.out

结果:

./a.out

address_in_a=0x60102c,
address_a=0x1b77fe50,
address_b=0x1b77fe5c,
address_outa=0x601028,
address_outb=0x601048,
address_malloc_try_1=0x601040,
address_main=0x400544,

说明:

堆:存放全局变量且在内存底部;

栈:存放局部变量在内存顶部;

代码段:在栈下面

分配内存:在堆中.

BSS段:暂时不明白.

补充:

.bss

未初始化的全局变量和局部静态变量一般放在bss段中.

我们知道未初始化的全局变量和局部静态变量默认值都为0,本来他们也可以被放到.data段中.但是,未初始化的全局变量和局部静态变量默认值都为0,所以为它们在.data段分配空间并存放0没有必要,程序运行的时候它们的确是要内存空间.并且可执行文件必须记录所有未初始化的全局变量和局部静态变量的大小总和,记为.bss段.所以bss段只是为未初始化的全局变量和局部静态变量预留位置而已,它并没有内容,所以它在文件中也不占据空间.

数据段、代码段、堆栈段、BSS段的更多相关文章

  1. 假设写一段代码引导PC开机这段代码是 ? Here is a tiny &quot;OS&quot; :-D

    Hello world -- OS 我找到了华科绍志远博士的相关代码,发现他依据MIT的JOS的boot.S 稍作改动.然后单独剥离出来,能够非常好玩~ 资料下载地址: http://download ...

  2. LINUX下目标文件的BSS段、数据段、代码段

    http://blog.chinaunix.net/uid-27018250-id-3867588.html bss 未初始化的全局数据 data 已经初始化的全局数据 text 代码段,机器指令 r ...

  3. 程序运行中(BSS段、数据段、代码段、堆栈)

    程序运行中(BSS段.数据段.代码段.堆栈) BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简 ...

  4. linux代码段,数据段,BSS段, 堆,栈(二)

    //main.cpp int a = 0; 全局初始化区  char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char ...

  5. 【转】linux代码段,数据段,BSS段, 堆,栈

    转载自 http://blog.csdn.net/wudebao5220150/article/details/12947445  linux代码段,数据段,BSS段, 堆,栈 网上摘抄了一些,自己组 ...

  6. 浅谈c语言代码段 数据段 bss段

    代码段.数据段.bss段 (1)编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分. (2)代码段:代码段就是程序中的可执行部分,直观理解 ...

  7. 静态库动态库的编译、链接, binutils工具集, 代码段\数据段\bss段解释

    #1. 如何使用静态库 制作静态库 (1)gcc *.c -c -I../include得到o文件 (2) ar rcs libMyTest.a *.o 将所有.o文件打包为静态库,r将文件插入静态库 ...

  8. C语言引用连接脚本lds中的符号——清除bss段,c实现方式

    之前我们的启动文件清除bss和拷贝都是通过汇编的方式的实现,但是,我们能够使用C语言,就不使用汇编: 先看连接脚本: SECTIONS { . = 0x30000000; __code_start = ...

  9. iOS测试一段代码的运行时间

    王刚韧 23:19:26测试一段代码的运行时间 测试一段代码运行花了多久: NSDate* tmpStartData = [NSDate date] ;<#代码#> double delt ...

  10. springboot工程启动即执行一段代码

    最近在做一个项目, 需要Tomcat启动后就执行一段代码 在这里需要用到CommandLineRunner这个接口, Spring boot的CommandLineRunner接口主要用于实现在应用初 ...

随机推荐

  1. 如何使用C#操作快捷方式(获取快捷方式属性、创建快捷方式)

    近来项目中有需要用到一个技术:使用C#操控快捷方式,包含创建和读取等.现整理一下实现方式,分享给大家. 第一步  创建一个项目 无需废话,跳过. 第二步  引用COM组件 右键“引用”,“添加引用”, ...

  2. C#实现网络传输数据加密

    1. 分组密码 分组密码是将明文消息编码表示后数字序列划分成长为n的分组,各组分别在密钥的作用下进行变换输出等长的数字序列,即密文.一次加密一个数据组,加解密所使用的是同一密钥,故其通常也称为对称加密 ...

  3. Couchbase上发布的关于NoSQL的技术论文

    Couchbase是CouchDB与Membase两个NoSQL数据库相结合的产物,本文推荐的是Couchbase官方发表的一篇论文,命名为<NoSQL Database Technology& ...

  4. php微信支付(仅Jsapi支付)详细步骤.----仅适合第一次做微信开发的程序员

    本人最近做了微信支付开发,是第一次接触.其中走了很多弯路,遇到的问题也很多.为了让和我一样的新人不再遇到类似的问题,我把我的开发步骤和问题写出来,以供参考. 开发时间是2016/8/2,所以微信支付的 ...

  5. CorelDRAW 插件的安装和使用

    CorelDRAW 是一款在中国非常受欢迎的图形软件,开放的界面和编程技术,能够对它进行二次开发制作插件,插件大抵有三种gms.cpg.exe格式,下面介绍一下这三种插件的安装和使用方法. 一.gms ...

  6. wxPython Modal Dialog 模式对话框

    <wxPython in Action>chap 9 笔记 1. Modal Dialog(模式对话框) A modal dialog blocks other widgets from ...

  7. 关于javascript的window.onscroll方法

    ---恢复内容开始--- 今天在学习javascript的过程中被onscroll这个东西堵了一下午.心情极度郁闷. 在高度较大的网页中,我们通常会加一个返回顶部的按钮,方便用户操作. 代码如下: & ...

  8. Oracle中的CR块详解

    1.概述 Cr块consistent read块也就是用来维护oracle的读一致性的数据块.当查询某些数据的时候,发现数据块的版本比我们要查询的新,例如session1执行了dml操作并没有提交,s ...

  9. [译] ASP.NET 生命周期 – ASP.NET 请求生命周期(四)

    不使用特殊方法来处理请求生命周期事件 HttpApplication 类是全局应用类的基类,定义了可以直接使用的一般 C# 事件.那么使用标准 C# 事件还是特殊方法那就是个人偏好的问题了,如果喜欢, ...

  10. QR code 金庸小说体(二)

    传说 在二维码世纪,流传着这样一个传说,long long ago,武林一片混乱,这时魔教二长老创立了一门绝世武功——QR code,随后称霸武林.但同时也遭到武林中人的觊觎和反抗,各大武林正派掌门人 ...