• 一直以来,我们只是单纯的去运行执行 C 程序,并没有关心这个可执行文件里面包含着什么东西。

  • 参考UNIX 环境高级编程 7.6,记录C程序的存储空间布局。

  • C程序由 正文段,初始化数据段,非初始化数据段,栈,堆组成

  • 正文段,初始化数据段,非初始化数据段(bss)

    正文段:CPU执行的机器指令部分。
    初始化数据段:通常将此段称为数据段,包含了程序中需明确的赋初始值的变量。比如说,c 程序中出现在任何函数之外的声明。静态变量都在 初始化数据段:static int i = 1000;全局变量int test = 100;
    非初始化数据段: 一般我们称为 bss 段,这一名称来源于早期的汇编运算符,意思是  block started by symbol , 在程序开始执行之前,kernel 会将这个 bss 段中的数据全部初始化为0或者是空指针。比如说:未初始化局部变量:static int chen;全局变量:ing test1[100];
  • 写一段简单的代码,看一下上面的内存分布, 名字是test.c:

    #include <stdio.h>                                                              void test(void)                                                                 {                                                                               printf("This is test function\n");                                          }                                                                               int main(void)                                                                  {                                                                               printf(" This is main function\n");                                         return 0;                                                                   } 
    看一下这个代码生成可执行文件的各个内存分布:sbc_7109_454_pdk3@aplex:~/test/c_program$ gcc test.c -o testsbc_7109_454_pdk3@aplex:~/test/c_program$ size testtext    data     bss     dec     hex filename1229     552       8    1789     6fd test  
    然后,我们在里面加一个局部变量,全局变量:
![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817113549365-425031064.png)
![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817113911240-769225067.png)
    在看一下局部静态变量:
![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817114334756-1509640442.png)
  • 栈和堆

    在执行程序前,我们能看到的是上面的 非初始化数据段以及初始化数据段和正文段,在执行了程序后,我们还能看到栈和堆。
    栈:自动变量以及每次函数调用时所需保存的信息都存放在此段中。每次调用函数时,其返回地址以及调用者的环境信息,都存放在栈中。然后,最近被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,可以递归调用C函数,递归函数每次调用自身时,就使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量。局部变量也是存放在栈区。
    堆:动态内存分配。堆处于非初始化数据段和栈之间。
  • 代码 test.c:

    #include <stdio.h>                                                              #include <stdlib.h>                                                             #include <string.h>                                                             void test(void)                                                                 {                                                                               printf("This is test function\n");                                          }                                                                               int test1 = 100;                                                                int test2;                                                                      int main(void)                                                                  {                                                                               int a;                                                                      static int b = 100;                                                         static int c;                                                               char *test3;                                                                test3 = (char *)malloc(sizeof(char) * 10);                                  int *pa = &a, *pb = &b, *pc = &c, *ptest1 = &test1, *ptest2 = &test2;          printf("桟:pa = %p\n", pa);   // 桟  stack                                 printf("堆:test3 = %p\n", test3);  // 堆 heap                              printf("bss: ptest2 = %p\n", ptest2); // 未初始化的数据区                   printf("bss: pc = %p\n", pc);   // 未初始化的数据区  bss                    printf("data: ptest1 = %p\n", ptest1);  // 初始化的数据区                   printf("data: pb = %p\n", pb);   // 初始化的数据区                          free(test3);                                                                return 0;                                                                   } 
![](http://images2017.cnblogs.com/blog/991711/201708/991711-20170817131823225-423244804.png)
  • 空间分配如下图所示:

C 程序的存储空间记录相关推荐

  1. 《OpenACC并行程序设计:性能优化实践指南》一 3.5 在应用程序执行期间记录性能信息...

    3.5 在应用程序执行期间记录性能信息 应用程序将自动使用第一个插装事件启动Score-P性能监视器.使用几个环境变量来配置性能监视器.为了尽量减小运行时间扰动,Score-P默认设置产生一个基于性能 ...

  2. 在windowService用Process.Start()启动程序没有界面-记录

    原文:在windowService用Process.Start()启动程序没有界面-记录 1.在服务程序安装时编程实现,ProjectInstaller.cs using System; using  ...

  3. outlook 未安装信息服务器,Outlook Web Access 未初始化并且在客户端访问服务器上的应用程序日志中记录了事件 ID 64...

    Outlook Web Access 未初始化并且在客户端访问服务器上的应用程序日志中记录了事件 ID 64 07/04/2014 本文内容 上一次修改主题: 2007-10-17 尝试访问 Micr ...

  4. 在Blazor中构建数据库应用程序——第6部分——向天气应用程序添加新记录类型及其UI

    目录 介绍 示例项目和代码 过程概述 数据库 CEC天气库 为记录添加模型类 添加一些实用程序类 更新WeatherForecastDbContext 添加数据和控制器服务 表单 WeatherSta ...

  5. python实现键盘记录木马_Python告诉你木马程序的键盘记录原理

    前言 Python keylogger键盘记录的功能的实现主要利用了pythoncom及pythonhook,然后就是对windows API的各种调用.Python之所以用起来方便快捷,主要归功于这 ...

  6. info setup 制作的安装程序 提示卸载程序出现内部错误找不到此版本的卸载程序的utCompiledCode记录

    在使用Inno Setup 工具制作客户端后,利用开始程序菜单中的卸载程序卸载时提示:卸载程序出现内部错误找不到此版本的卸载程序的utCompiledCode记录. 这是因为在制作客户端时,没有删除原 ...

  7. Qt程序单元测试学习记录

      7月比较忙,很少更新博客,上旬任务是给公司原来的程序做简单的单元测试.毕业这两年写过很多代码,从来没有注意过单元测试这东西,现在开始认真对待,开始看别人写的文章来学习.这里记录下最近学到的,以及自 ...

  8. [电离层建模学习笔记]开源程序M_GIM学习记录

    [电离层建模学习笔记]开源程序M_GIM学习记录 文章目录 [电离层建模学习笔记]开源程序M_GIM学习记录 1. 程序相关信息 2. 程序学习记录 2.1 采用的数据说明 2.2 程序运行前 2.3 ...

  9. 减肥日记---那个胖子终于瘦下来了 程序员减肥记录 程序员减肥日记

    减肥日记---那个胖子终于瘦下来了 程序员减肥记录 程序员减肥日记 一.前言 早晨起来,称一称 67.6,心中窃喜,目标达成.当了这么多年胖子,终于摆脱了. 我,又瘦下来了,终于不再是胖子啦,哈哈哈. ...

最新文章

  1. Yolov5 face训练手册
  2. primefaces 查询 点击按钮 加载 动画 ajax loader
  3. 中石油训练赛 - Cafebazaar’s Chess Tournament(FFT)
  4. 记一次中小公司的研发问题
  5. 生产中k8s适合mysql_在K8S集群中构建复杂的MySQL单实例数据库
  6. Redisson 实现分布式锁
  7. linux缓存机制buffer/cache/swap
  8. foxmail新建文件夹失败或者新建文件夹不显示的问题
  9. MXY---Docker
  10. Chaotica for Mac(分形艺术作品创作工具)
  11. c语言析构函数的作用,详解析构函数出现的必要性
  12. 苹果手机上的计算机恢复出厂设置在哪里,苹果手机怎么还原出厂设置【详解】...
  13. hdu2458 2010.3.6
  14. qcom 音频相关的dsp driver笔记(基于msm8996平台)
  15. javaweb项目实训总结_JAVAWEB实训心得体会
  16. 黑马瑞吉外卖项目开发笔记
  17. 01.Polsarpro软件介绍
  18. 一个int类型到底占多少个字节
  19. 自动化测试框架之unittest
  20. 阿里云物联平台产品、设备及物模型添加模拟数据(实操)

热门文章

  1. python调用窗口_如何调用一个函数并在另一个窗口中打开?
  2. 电机驱动板连线_伺服驱动器的工作原理和内部结构是什么?
  3. 崩坏三x86架构闪退_不给X86留活路?苹果下一代M系列芯片竟然这么强
  4. beats耳机用安卓手机影响音效么_感受清晰细腻音质,实用有线入耳式耳机推荐...
  5. java通用日志记录_JAVA实现通用日志记录方法
  6. 全场灭灯_海天黄豆酱《新相亲大会2》首遇滑铁卢,男嘉宾险遭全场灭灯
  7. cpc卡内计费信息异常包括_妈妈网广告投放怎么做、妈妈网广告|妈妈网信息流广告投放有哪些计费方式?...
  8. acrobat 下拉列表 逻辑_记一次 无限列表 滚动优化
  9. linux获取主板温度电压_自学修电脑:常见主板报警声解析!
  10. php兼容编码,PHP截取字符串编码(兼容utf-8和gb2312)