Linux 应用程序的内存分配中,是用 segment(段)进行区别的,使用 size 命令进行查看:

size a.out
text data bss dec hex filename
1639 264 8 1911 777 a.out

    可见,数据是分配 text 段,data 段,bss 段,这里使用size 命令的查看只能是看到这三个段的大小(编译的阶段就可以确定下来)而,堆、栈则是在运行的时候动态去分配空间的。

一、Linux 段的分配

text:代码段,存储代码、常量、字符串等只读的数据

data: 数据段,保存的是有经过初始化的全局变量和静态变量的部分。这里的初始化,初始化的值必须不能为零

bss: bss 段,保存的是没有经过初始化的全局变量、静态变量和初始化的值为零的全局变量和静态变量。

堆(heap): 用于动态内存的分配额哦,程序猿手动调用 malloc 进行分配和释放。

栈(stack):存放局部变量和函数的参数等。

 

二、内存分配

    Linux 下可执行文件是安装段的方式进行管理的,一个可执行的文件是按照如下的方式进行映射:

                                    

2.1、a.out 文件的介绍

    一个可执行的文件,window 平台是通过 .exe 或者 .txt 等后缀的方式进行区分的,但是Linux 下的可执行文件则是通过一些特定的、神气的数字进行表示的。

    一个可执行的文件是通过一些数字唯一地表示是可执行的文件,通过这样的方法达到标签的目的,这些数字我们称之为神气的数字,而这些数组是通过能够被确认下来的,一组随机的二进制位的集合。

2.2、映射

    一个可执行的文件,就按照可执行文件的段,进行映射到内存中的。

    段,实质上就是一段连续的虚拟内存地址空间。这里需要注意的是,在最低的地址的位置存在一部分未被映射的区域,虽然它是在进程的地址空间内,但是并未被赋予物理地址,所以对这块区域的引用都是违法的。在典型的情况下,它是从零地址开始的几 K 字节,它用于捕捉使用空指针和小整型的指针应用内存的情况(摘自C专家编程)。

二、大小的比对

计算 size a.out 的大小

原始的大小;

int main()
{
printf("hellow world\n");
}
text data bss dec hex filename
1132 256 8 1396 574 a.out


 

1、局部变量是存储在栈中:


 
int main()
{
int a;
printf("hellow world\n");
}
~
text data bss dec hex filename
1132 256 8 1396 574 a.out


 

2、局部变量(局部数组)也是存储在栈中:

int main()
{
int a;
int b[100];
printf("hellow world\n");
}
text data bss dec hex filename
1132 256 8 1396 574 a.out


 

3、字符串(常量是存储在text中)

int main()
{
int a;
int b[100] = L"qxj511";
printf("hellow world\n");
}
text data bss dec hex filename
1639 256 8 1903 76f a.out


 

4、没有经过初始化的静态变量是存储在 BSS 段中:


 
int main()
{
int a;
int b[100] = L"qxj511";
static c;
printf("hellow world\n");
}
text data bss dec hex filename
1639 256 12 1907 773 a.out


 

5、经过初始化的静态变量是存储在 data 段中:

int main()
{
int a;
int b[100] = L"qxj511";
static c = 1;
printf("hellow world\n");
}
text data bss dec hex filename
1639 260 8 1907 773 a.out


 

6、没有经过初始化的全部变量存储在 bss 端中:

int d;
int main()
{
int a;
int b[100] = L"qxj511";
static c = 1;
printf("hellow world\n");
}
text data bss dec hex filename
1639 260 12 1911 777 a.out


 

7、经过初始化的全局变量存储在 data 段中:

int d = 1;
int main()
{
int a;
int b[100] = L"qxj511";
static c = 1;
printf("hellow world\n");
}
text data bss dec hex filename
1639 264 8 1911 777 a.out


最新文章

  1. 如何自己编写Makefile
  2. 【使用git】初识git
  3. Android调用基于.net的WebService
  4. 剑指offer系列21--二叉搜索树的后续遍历序列
  5. 重新设置MySQL的root密码
  6. 用maven打包项目成war文件
  7. win7下让程序默认以管理员身份运行
  8. Python tools used for file name devision
  9. js数组操作-打乱数组
  10. wangEditor的jQuery插件化
  11. 1013团队Beta冲刺day4
  12. POJ1222熄灯问题
  13. Bigger-Mai 养成计划,前端基础学习之HTML
  14. MySQL 8.0常见问题
  15. js给页面添加回车监测事件,实现回车登录功能
  16. Loj 【CQOI 2006】简单题,mmp
  17. Java几种常见的编码方式
  18. BSGS模板(慢速)
  19. matlab std函数 用法及实例
  20. Ubuntu 登陆界面无限循环问题 以及 root用户无法使用命令问题

热门文章

  1. [HAOI2010][bzoj2424] 订货 [费用流]
  2. js确保正确this的几种写法
  3. php合并图片
  4. exit() 与 return() 的区别
  5. 用 config drive 配置网络
  6. 51 Nod 1678 lyk与gcd
  7. 【CF1015F】Bracket Substring(字符串DP)
  8. 8个学习.net的博客链接 (以前收藏过更多的,被百度新版搞没了,恨死了)
  9. About chrysanthemum and matrimony vine
  10. sooket数据成传输压缩