一、各段内存布局

内存布局图

1.BSS段(Block Started by Symbol)未初始化段

2.linux ELF base address is 0x8048000

应用程序虚拟地址起始地址均为0x8048000

3.堆向高内存地址生长

4.栈向低内存地址生长

P.S.

// 查看进程ID 图片

ps aux

cat /proc/3794/maps

代码段——只读r 可执行x

起始地址必为0x8048000

二、数据存放位置

  • 分析数据存放位置

    对比即可

结论

1.代码段:代码,全局常量(const)、字符串常量

2.数据段(广义数据段,含BSS段):全局变量(初始化以及未初始化的)、静态变量(全局的和局部的、初始化的以及未初始化的)

3.堆:动态分配的区域

4.栈:局部变量(初始化以及未初始化的,但不包含静态变量)、局部只读变量(const)

动手尝试即可

#include <stdio.h>
#include <stdlib.h> int global_init_a = 1; //全局,初始化 :数据段
int global_uninit_a; //全局,未初始化:数据段
static int static_global_init_a =1;//全局,静态,初始化 :数据段
static int static_global_uninit_a;//数据段
const int const_global_a =1; //全局常量 :代码段 int global_init_b = 1;
int global_uninit_b; //全局,未初始化
static int static_global_init_b =1;//全局,静态,初始化 :数据段
static int static_global_uninit_b;
const int const_global_b =1; int main()
{
int local_init_a = 1; //Stack 栈
int local_uninit_a;
static int static_local_init_a =1;//局部静态:数据段
static int static_local_uninit_a;
const int const_local_a =1; //局部常量:栈 int local_init_b = 1;
int local_uninit_b;
static int static_local_init_b =1;
static int static_local_uninit_b;
const int const_local_b =1; int* malloc_p_a;
malloc_p_a = malloc(sizeof(int));//通过malloc分配得到的,局部 :堆 //打印地址
printf("&global_init_a = %p, global_init_a =%d\n",&global_init_a,global_init_a);
printf("global_uninit_a =%p, global_uninit_a = %d\n",&global_uninit_a,global_uninit_a);
printf("&static_global_init_a =%p,static_global_init_a = %d\n",&static_global_init_a,static_global_init_a);
printf("static_global_uninit_a = %p,static_global_uninit_a = %d\n",&static_global_uninit_a,static_global_uninit_a);
printf("const_global_a = %p,const_global_a =%d\n",&const_global_a,const_global_a ); printf("&global_init_b = %p, global_init_b =%d\n",&global_init_b,global_init_b);
printf("global_uninit_b =%p, global_uninit_b = %d\n",&global_uninit_b,global_uninit_b);
printf("&static_global_init_b =%p,static_global_init_b = %d\n",&static_global_init_b,static_global_init_b);
printf("static_global_uninit_b = %p,static_global_uninit_b = %d\n",&static_global_uninit_b,static_global_uninit_b);
printf("const_global_b = %p,const_global_b =%d\n",&const_global_b,const_global_b); printf("&local_init_a = %p,local_init_a =%d\n",&local_init_a,local_init_a);
printf("&local_uninit_a =%p,local_uninit_a\n",&local_uninit_a,local_uninit_a);
printf("&static_local_init_a = %p,static_local_init_a=%d\n",&static_local_init_a,static_local_init_a);
printf("&static_local_uninit_a= %p,static_local_uninit_a= %d\n",&static_local_uninit_a,static_local_uninit_a);
printf("&const_local_a =%p,const_local_a=%d\n", &const_local_a,const_local_a); printf("&local_init_b = %p,local_init_b =%d\n",&local_init_b,local_init_b);
printf("&local_uninit_b =%p,local_uninit_b\n",&local_uninit_b,local_uninit_b);
printf("&static_local_init_b = %p,static_local_init_b=%d\n",&static_local_init_b,static_local_init_b);
printf("&static_local_uninit_b= %p,static_local_uninit_b= %d\n",&static_local_uninit_b,static_local_uninit_b);
printf("&const_local_b =%p,const_local_b=%d\n", &const_local_b,const_local_b); printf("malloc_p_a = %p,malloc_p_a",&malloc_p_a,malloc_p_a);
while(1); return 0; }

三、BSS段

  • (Block Started by Symbol)未初始化段
  • 利用readelf –S 程序名 分析BSS段
  • elf 为可执行文件类型

【Linux】应用程序内存段布局的更多相关文章

  1. Linux C程序内存空间

    linux下内存空间布置: 一个典型的Linux C程序内存空间由如下几部分组成: 代码段(.text).这里存放的是CPU要执行的指令.代码段是可共享的,相同的代码在内存中只会有一个拷贝,同时这个段 ...

  2. Linux应用程序的地址布局

    转载自:http://blog.csdn.net/embedded_hunter http://www.360doc.com/content/12/0405/00/1671317_200882538. ...

  3. linux C 程序内存布局

    参考: 1. http://www.cnblogs.com/clover-toeic/p/3754433.html 2. http://www.cnblogs.com/jacksu-tencent/p ...

  4. linux结束程序内存不会马上释放的解决方法

      Linux下频繁读写文件时,内存资源被耗尽,当程序结束后,内存不会释放需要清除缓存.Linux缓存有dentry,buffer cache,page cache. 注:Dentry用来加速文件路径 ...

  5. linux系统进程的内存布局

    内存管理模块是操作系统的心脏:它对应用程序和系统管理非常重要.今后的几篇文章中,我将着眼于实际的内存问题,但也不避讳其中的技术内幕.由于不少概念是通用的,所以文中大部分例子取自32位x86平台的Lin ...

  6. C程序内存分配

    在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中.这个沙盘就是虚拟地址空间(virtual address space),在32位模式下它总是一个4GB的内存地址块.这些虚拟地址通过页 ...

  7. c程序内存模型

    这篇文章主要记录一下c程序运行时内存空间如何使用.(摘抄自网络) 在一个多任务操作系统中的每个进程都运行在它自己的内存“沙箱”中.这个沙箱是一个虚拟地址空间(virtual address space ...

  8. Unix下C程序内存泄露检测工具:valgrind的安装使用

    Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...

  9. linux应用程序地址布局,王明学learn

    linux应用程序地址布局 在学习Linux应用程序开发时,经常会遇到如下概念:代码段.数据段.BSS段(Block Started by Symbol,又名:未初始化数据段).堆(heap)和栈(s ...

随机推荐

  1. css3之animation制作闪烁文字效果 转

    原文 http://www.w3cfuns.com/notes/13835/596cd96f59a09431a2343a9726c295d5.html <!DOCTYPE html>< ...

  2. Python-is, ==, cmp()

    is 主要是判断 2 个变量是否引用的是同一个对象,如果是的话,则返回 true,否则返回 false. 判断数字相等不要用 is 操作符 1 2 3 4 5 6 7 8 9 10 11 12 > ...

  3. PHP报错

    php.ini ; 错误日志 log_errors = On ; 显示错误 display_errors = Off ; 日志路径 error_log = "/usr/local/lnmp/ ...

  4. Web Worker 案例

    什么是 Web Worker? 当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成. web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性 ...

  5. 马踏棋盘--dfs

    [问题描述]关于马踏棋盘的基本过程:国际象棋的棋盘为 8*8 的方格棋盘.现将"马"放在任意指定的方格中,按照"马"走棋的规则将"马"进行移 ...

  6. python发送信息到邮箱

    import smtplib from email.mime.text import MIMEText 设置服务器所需信息 163邮箱服务器地址 mail_host = 'smtp.163.com' ...

  7. mapper mysl实现批量插入 更新

    1.批量插入 <insert id="insertConfirm" parameterType="java.util.List"> insert i ...

  8. flex buider 4.6 打开设计模式(designer)时提示内存不足错误的解决办法

    先申明,此方法只适用于flex builder 4.6及以下版本, flex builder 4.7以后已经完全取消了designer功能,是没有办法补救的. 1. 首先下载APE文件,这个文件好像是 ...

  9. HDU 5316——Magician——————【线段树区间合并区间最值】

    Magician Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  10. 【Linux】Linux系统启动过程

    1.Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行 init. 系统初始化. 建立终端 . 用户登录系统. 1.Linux系统的启动过程并不是大家想象 ...