在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. GDI+绘制文本

    这是在论坛中有人提出的一个问题,原贴见:Graphics DrawString参数无效.这里给出方法,读者可以自行修改以适应自己的项目需求. 先上代码: if (!Page.IsPostBack) { ...

  2. BroadcastReceiver

    BroadcastReceiver 广播接受者 Android中, Broadcast是一种数据传递的方式/通信方式. Brodadcast 是Android 系统组件之一 广播的特性 1. 由一个发 ...

  3. encodeURIComponent与encodeURI的区别

    encodeURIComponent()   -->把字符串编码为 URI 组件. encodeURI()                   -->把字符串编码为 URI. var te ...

  4. Android:ListView之ViewHolder

    前言 在开发Android应用过程中经常要与列表展示打交道,比如Listview.在使用过程中如果不能正确的进行细节处理那么对性能还是有很大的损耗的. Listview展示内容是通过一个Adapter ...

  5. Spark Tungsten揭秘 Day3 内存分配和管理内幕

    Spark Tungsten揭秘 Day3 内存分配和管理内幕 恭喜Spark2.0发布,今天会看一下2.0的源码. 今天会讲下Tungsten内存分配和管理的内幕.Tungsten想要工作,要有数据 ...

  6. 1079. Total Sales of Supply Chain (25)

    时间限制 250 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A supply chain is a network of r ...

  7. ORA-19809: 超出了恢复文件数的限制

    实验环境:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod 实验背景:向tough.t中插入40万条记录,然后rollb ...

  8. Linux中Kill进程的N种方法

    常规篇: 首先,用ps查看进程,方法如下: $ ps -ef …… smx       1822     1  0 11:38 ?        00:00:49 gnome-terminal smx ...

  9. orcale同一条语句运行速度差异问题

    在oracle中执行一个查询语句,该语句首次执行时orcale会把其内容存入SGA(系统全局区)中,下次再执行同一条语句的时候就不再去解析该语句,而是直接从SGA区中取出该语句执行,但是前提是SQL没 ...

  10. 获取网页上数据(图片、文字、视频)-b

    Demo地址:http://download.csdn.net/detail/u012881779/8831835 获取网页上所有图片.获取所有html.获取网页title.获取网页内容文字... . ...