程序的组成部分

如上图所示。程序由 code 到 stack 地址由小到大,

.text 之前有一段不可读的区域;

.text + .rodata + .data + .bss + .heap + .stack的大小是在程序编译阶段确定的;

  • .text 段:存放程序代码的区域;

  • .rodata 段:ro 表示 read only ,rodata 表示只读常数据段;

    • 常量不一定存放再 .rodata 处,也有可能存放再 .text例如一些立即数;
    • 字符串常量存放在 .text段,在编译期间就可以确定;
    • const 修饰的变量存放在 .text 段,在程序运行期间确定
  • .data 段:存储已初始化的全局变量;已初始化的全局变量在文件和运行中都占存储空间;

  • .bss 段:存放未初始化的全局变量或者全局变量初始化为 0;

    • 在文件中不占存储空间;
    • 在运行中占存储空间;
  • heap 段:堆区,用于动态申请内存的区域,由程序员申请内存和释放内存;

    • malloc:用来分配一块制定大小的内存;
    • realloc:用来调整/重分配一块存在的内存;
    • free:用来释放不再使用的内存;
    • 内存泄漏:内存分配了不释放;
    • 程序 crash:释放了不存在的内存;
    • 缓冲区溢出(Buffer Overflow):写或读超过范围的内存;
    • 可以使用 valgrind 程序内存;
  • .stack 段:栈区,存放局部变量和函数参数,由系统申请内存和释放内存;

    • 栈是一种数据结构,栈中数据的存取方式是:先进先出,后进后出;
    • 通常情况下,栈地址向下(低地址)增长,没 Push 一个地址,栈顶就向低地址扩展,每 Pop 一个元素,栈顶就向高地址回退;
  • Stack 之后是不可访问的系统代码区;

示例说明 .data.bss

.data 段的变量既占文件空间,又占运行空间

// 文件名: data.c
int data_arr[1024 * 1024] = {1, }; // .data 段,初始化为 1,空间大小为 4M;
int main(int argc, char *argv[])
{return 0
}$ gcc -g data.c -o data
$ ls -l data
-rwxrwxr-x 1 zach zach 4203984 9月 6 08:27 data
objdump -h data | grep \\.data24 .data 00400020 0000000000601020 0000000000601020 00001020 2**5

由上述可知文件空间和运行空间,都有 4M 多;

.bss 段的变量不占文件空间,但是占用运行空间;

// 文件名: bss.c
int data_arr[1024 * 1024] = {0, }; // .bss 段,初始化为 0,空间大小为 4M;
int main(int argc, char *argv[])
{return 0;
}$ gcc -g exercise.c -o bss
$ ls -l bss
-rwxrwxr-x 1 zach zach 9664 9月 6 08:31 bss
$ objdump -h bss | grep \\.bss25 .bss 00400020 0000000000601040 0000000000601040 00001030 2**5

由上述可知,.bss 段不占文件空间,占用运行空间;

代码说明

int data_arr2[1024 * 1024] = {1, }; // .data 段
int data_arr1[1024 * 1024] = {0, }; // .bss 段
char * p1;  // .bss段
int main()
{int b; // 栈区 .stackchar s[] = "abs"; // 栈区 .stackchar *p2; // 栈区 .stackchar *p3 = "12345"; // “12354\0”在只读常量区 .rodata,p3在栈区static int c = 0; / / 全局静态区,.bss段p1 = (char *)malloc(10);// 在堆区分配10个Bytep2 = (char *)malloc(20);// 在堆区分配20个Bytestrcpy(p1,"123456"); // “123456\0”在常量区,常量区应该介于code和Data之间
}

内存的分配方式

主要由三种分配方式:

  • 在静态存储区分配:

    • 涉及到的变量由:字符串常量、static 申请的变量, 全局变量;
    • 涉及到的内存区段有:.rodata 段、.data 段.bss 段;
    • 静态存储区的变量生命周期是整个程序的运行周期;
  • 在栈上分配:
    • 局部变量;
    • 函数的形参;
    • 在函数退出时,自动清空;
  • 在堆上分配:动态内存分配:
    • molloc 申请内存;
    • realloc 再分配;
    • free 释放内存;

程序是如何运行起来的(MD格式)相关推荐

  1. 小程序问题记录 | 使用官方提供的云数据库存储md格式的文件,前台解析遇到的坑!!!!

    官方提供了云开发方案,真的是省心,又省钱.(非广告☹️) 可坑死我了... 由于我要在前台展示类似于blog格式的文章,markdown作为源数据.起初是在本地封装module的方案,来提供md数据源 ...

  2. 数据库结构文档生成(支持Excel,Word,HTML,MD格式)

    这是一款导出Mysql数据表到Excel表格的小程序 项目下载地址 已上传项目地址 效果图 ####excel格式 ####WORD格式 ####MD格式 项目初始化步骤: 1.配置applicati ...

  3. 在多线程 Python 程序中实现多目标不同缩进格式的 logging

    <本文的原始位置: http://bluegene8210.is-programmer.com/posts/21754.html> ---- 带有动态缩进格式的自定义 logging 机制 ...

  4. 精致全景图 | 程序是如何运行起来的

    hi,大家好,当程序员的第一个程序:hello,word能成功跑起来的时候,很多人就很好奇,我们程序是如何运行起来的?今天分享一篇好文,帮你解惑,希望对你理解计算机原理有一定帮助! 因为图片比较大,微 ...

  5. 使用记事本写java程序并编译运行过程

    写一个简单的java源文件:HelloWorld.java public class HelloWorld{public static void main(String[] args){System. ...

  6. IOS学习笔记05---C语言程序的开发运行过程

    IOS学习笔记05---C语言程序的开发运行过程 0 5.C语言3-C语言程序的开发运行过程 ----------------------------------------------------- ...

  7. linux执行可执行命令程序ls,linux运行可执行程序命令

    linux 命令行如何运行程序 我用的是Ubuntu,安装了一个分子模拟软件,但是不知道如何运行程序,比cd到目录下,然后ls -l tleap,如果有x权限,直接./tleap,如果没有x,就先执行 ...

  8. 一零二八、将csdn文章内容保存成 html、pdf、md格式

    目录 一.获取专栏地址 二.下载转换工具 三.创建HTML MD PDF 文件夹 四.启动程序 五.源代码 代码思路: 1.确定目标需求:将csdn文章内容保存成 HTML.PDF.md格式- 1.1 ...

  9. 重学计算机(六、程序是怎么运行的)

    今天我们又来肝一个重要的主题.不知道大家有没有思考过,程序是怎么运行起来的? 肯定有同学说在linux下./hello_world就可以执行了,在windows下双点hello_world.exe文件 ...

  10. Java程序是怎么运行的?

    文章目录 Java程序是怎么运行的? 具体流程 编译 类加载 加载 验证 准备 解析 初始化 创建对象 方法调用 解释 执行指令 多线程上下文切换 Java程序是怎么运行的? 概括来说,写好的 Jav ...

最新文章

  1. MapReduce1和Yarn的工作机制
  2. 程序员的小天地:注释中的快乐
  3. linux下的常用命令
  4. java的未检查异常有哪些_Java:检查异常与未检查异常
  5. mysql linux64安装----转载
  6. mysql cmd grep_通过 mysqlbinlog 和 grep 命令定位binlog文件中指定操作
  7. opencv中mean函数耗时_使用OpenCV进行人脸对齐
  8. 简谈Java的join()方法(转)
  9. 倾斜摄影三维建模全流程
  10. 【历史上的今天】10 月 1 日:仙童半导体公司诞生;斯坦福大学正式办学;万维网之父成立万维网联盟
  11. kali下使用远程桌面连接
  12. cpci检索为什么那么慢_cpci检索论文含金量高吗?
  13. 流放者柯南服务器文件,《流放者柯南》个人服务器架设教程文本及视频详解
  14. 圣诞使用循环打印以下圣诞树:要求输入树的高度,打印树
  15. 敏捷项目管理传统项目管理的区别
  16. css绘制一个Pinia小菠萝
  17. 几乎每个人都听说过三皇五帝,那么三皇五帝是否存在?又是谁呢?
  18. JAVA工程师面试题目大全_绝对值得看
  19. 正则表达式包含某字符串且不包含某些字符串
  20. Java基础冒泡排序——高低输出十个学生的成绩

热门文章

  1. 简约的Flask代码统计系统
  2. CTFshow-菜狗杯WP
  3. unity homework3
  4. linux查看内核数量命令
  5. spring利用javamail,quartz定时发送邮件
  6. 程序员你能发现自己的Bug吗?
  7. 通过Maxwell解析MySQL Binlog,打好业务多活的基础
  8. nginx反向代理内外网跳转
  9. unity 项目文件夹保存哪2个_Unity3D 项目专属文件夹须知
  10. Check the difficulty of problems (概率dp求概率)