在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. lex&yacc 9

    the "line 15: error: syntax error" cant stop, if i test the statement "i<=0" ...

  2. zabbix短信接口调用

    #!/bin/bash TIME=`date +%Y-%m-%d` KEY="UJK9rk50HD8du8JE8h87RUor0KERo5jk" username="za ...

  3. Geographic Coordinate Systems

    Coordinate Systems Geographic Coordinate Systems This is an archive of a previous version of the Arc ...

  4. [ Windows] [ OS ] [ Remote Desktop ] 開啟同一個帳號同時2的連線RDP的方式

    感謝同事 Allen 的Support :) 執行>gpedit.msc 電腦設定>Windows元件>遠端桌面服務>遠端桌面工作階段主機>連線>限制遠端桌面服務的 ...

  5. 51nod1264线段相交

    1264 线段相交 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交). 如果相交, ...

  6. LAMP(Ubuntu+apache+mysql+php)+Zend Studio 新手の PHP的开发环境搭建

    因为工作需要,就从c#转型过来研究PHP.可是没想到从一开始就遇上了问题,环境配置方面的问题足足令我头疼了两天.因为博主本人对于linux的接触非常少,所以在解决这个问题的时候也学到了不少东西, 非常 ...

  7. Describe the difference between repeater, bridge and router.

    中继器,路由器,网桥,网关的区别. 路由器:网络层设备,实现复杂的路径选择,控制IP包从源到目的地的路径:根据IP地址进行选路和转发IP数据包 中继器:物理层设备,物理信号的重新生成,对信号进行整形和 ...

  8. oracle创建表空间、用户

    创建表空间 create tablespace '<数据库名>' datafile '<存储路径>' size 500M default storage (initial 20 ...

  9. Increase SharePoint Execution Timeout

    <system.web> <compilation batch="false" batchTimeout="600" maxBatchSize ...

  10. AOP和IOC个人理解

    14:18 2014/5/5 IOC inversion of control 控制反转  将new对象的权力由调用者转移到spring容器(即xml文件),Struts2与Spring整合(scop ...