程序的组成部分

2023-11-13

程序的组成部分

程序组成部分

如上图所示。程序由 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 \\.data
 24 .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 \\.bss
 25 .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; // 栈区 .stack
     char s[] = "abs"; // 栈区 .stack
     char *p2; // 栈区 .stack
     char *p3 = "12345"; // “12354\0”在只读常量区 .rodata,p3在栈区
     static int c = 0; / / 全局静态区,.bss段
     p1 = (char *)malloc(10);// 在堆区分配10个Byte
     p2 = (char *)malloc(20);// 在堆区分配20个Byte
     strcpy(p1,"123456"); // “123456\0”在常量区,常量区应该介于code和Data之间
}

内存的分配方式

主要由三种分配方式:

  • 在静态存储区分配:

    • 涉及到的变量由:字符串常量、static 申请的变量, 全局变量;

    • 涉及到的内存区段有:.rodata 段、.data 段,.bss 段;

    • 静态存储区的变量生命周期是整个程序的运行周期;

  • 在栈上分配:

    • 局部变量;

    • 函数的形参;

    • 在函数退出时,自动清空;

  • 在堆上分配:动态内存分配:

    • molloc 申请内存;

    • realloc 再分配;

    • free 释放内存;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序的组成部分 的相关文章

  • 基于遗传算法GA算法优化BP神经网络(Python代码实现)

    一 概述 BP GA算法的设计 基于遗传算法的BP神经网络算法 以下简称BP GA 就是在BP神经网络的学习过程中 将权重和阀值描述为染色体 并选取适宜的适应函数 然后进行GA迭代 直到某种意义上的收敛 与普通BP学习算法相比 算法 BP一
  • redis 主从配置

    转 https blog csdn net github 26672553 article details 69568259 redis主从配置初步 2个节点主从 如果我们redis的压力很大 如果我们的并发高到我们读数据和写数据都有了很大
  • 二维码的生意几乎革掉了钱包的命

    刷脸支付无需结账台 无需手机 如果说说二维码让手机成为了钱包 那刷脸支付则索性让钱包这个东西都直接革掉 而这也点燃了国内的新零售浪潮 二维码 革命的祸首在移动支付普及 线上线下建立联系这件事上 二维码其实功不可没 在此之前 线上的归线上 线
  • Cmake 官方中文教程

    CMake官方教程 2018年04月03日 22 00 21 SoftGit 阅读数 23072 很好的一个官方教程翻译文档 CMake简介 CMake是一个跨平台的 开源的构建工具 cmake是makefile的上层工具 它们的目的正是为
  • Node js 项目启动报错,错误码,events.js:141,throw er; //Unhandled 'error' event,解决办法

    Node js 项目启动报错 错误码 events js 141 throw er Unhandled error event 解决办法 当我遇到这个问题的时候 我纠结了好半天 找了好多资料 都说是端口占用 必须杀死端口重新启动 确实是这样

随机推荐

  • 上架发布应用市场资料填写规则限制

    应用名称填写时 名字长度有没有限制呢 1 名称 1 字数限制 iOS 30 Android 64 2 应用市场显示的名称 2 副标题 1 字数限制 iOS 30 2 应用市场显示的副标题 宣传文本填写时 可以编写多少个字 1 字数限制 iO
  • 目标检测分块知识总结 2

    tags 目标检测 1 FSAF 论文题目 Feature Selective Anchor Free Module for Single Shot Object Detection 2019 文章主要解决在进行多尺度检测的时候 利用特征金
  • C语言数据类型32位和64位不同

    http blog csdn net kongdefei5000 article details 38866985 C语言编程需要注意的64位和32机器的区别 一 数据类型特别是int相关的类型在不同位数机器的平台下长度不同 C99标准并不
  • linux修改启动内核版本

    cd etc default sudo gedit grub 编辑grub文件 修改grub文件如下 GRUB DEFAULT 1 gt 9 其中 1 代表开机启动界面中 选择 Advancded options for Ubuntu 选项
  • 初学黑客攻防[1]--禁止其他电脑访问本地电脑的80端口

    首先 win10家庭版需添加 本地安全策略 后进行该练习 1 打开 记事本 输入以下代码 echo off pushd dp0 dir b SystemRoot servicing Packages Microsoft Windows Gr
  • xilinx axi_iic IP使用分享

    仿真环境 例化了两组axi iic 的IP 一个slv一个mst slv地址固定为0x33 7bit模式 iic总线速率为4000K 仿真发现每次只能发送3byte数据 和实际不符 仿真仅作参考 由于iic为双向端口 通过例化顶层将IO连接
  • rsync实时监控以及守护进程

    rsync守护进程模式 服务端的操作 1 安装 root backup yum install y rsync 2 修改配置文件 下面有配置文件详解 root m01 vim etc rsyncd conf uid rsync gid rs
  • 关于jax,tensorflow的安装详细教程

    jax在下面pycharm中有提示你在哪里下载 所以如果下次遇到有什么要下载的包都可以尝试这种方式去下载 在找找pycharm有没有提示 然后直接点网站看教程 这嘎是官网的教程 很详细 为了下载一个版本只有JAX的cpu 可能要用到当地的开
  • 第四章 云原生架构之Kubernetes基础知识

    1 K8S整体架构 1 1 概述 Kubernetes是一个可移植 可扩展的开源平台 用于管理容器化的工作负载和服务 简称 K8S K8S的本质是一组服务器集群 可以在对应服务器集群的每个节点上运行程序 来对节点中的容器进行管理 类似Mas
  • 图形编程丨图形绘制基础imgui篇—D3D9 HOOK 创建内部Imgui窗口

    作者 小阿栗 Imgui又称为Dear ImGui 它是与平台无关的C 轻量级跨平台图形界面库 没有任何第三方依赖 可以将Imgui的源码直接加到项目中使用 也可以编译成dll Imgui使用DX或者OpenGL进行界面渲染 Imgui主要
  • Redis三种集群模式-主从模式

    一 引言 Redis有三种集群模式 第一个就是主从模式 第二种 哨兵 模式 第三种是Cluster集群模式 第三种的集群模式是在Redis 3 x以后的版本才增加进来的 我们今天就来说一下Redis第一种集群模式 主从集群模式 二 配置说明
  • Beauty of the soul is the essential beauty(183词 批改网91)

    What proves universally acknowledged is that essential beauty has triggered widespread public attention Undoubtedly the
  • Hive(5) Hive的数据类型

    HIve 2 Hive的数据类型 数据类型 基本数据类型 Hive数据类型 对应Java数据类型 长度 byte 举例 tinyint byte 1 10 smallint short 2 20 int int 4 30 bigint lo
  • druid 概述

    1 什么样的业务适合用 Druid 时序化数据 Druid 可以理解为时序数据库 所有的数据必须有时间字段 实时数据接入可容忍丢数据 tranquility 目前 tranquility 有丢数据的风险 所以建议实时和离线一起用 实时接当天
  • linux 命令:umask 详解

    umask 的功能是展示或设置文件模式掩码 用法 umask p S mode 使用 mode 描述的格式设置文件模式掩码 如果未指定 mode 展示当前掩码 mode 可以是八进制数或者类似 chmod 中的符号字符串 p 以八进制数字表
  • sketch2code 有的叫screenshot to code什么的

    先mark一下项目 回头再深究 https github com mzbac sketch2code https www floydhub com emilwallner datasets html models 1 archives 转载
  • Undefined symbol解决方法

    1 初级错误 1 C中未定义 2 H中未引用 3 未包含含有该类型的 H文件 4 在keil中未添加 C或 H文件到工程 2 C和C 代码混合调用引起的未定义错误 1 一般情况下 Error L6218E Undefined symbol
  • 随机森林的优缺点

    网上有很多关于随机森林优缺点的总结 但是都只是抄来抄去 并没有对这些优缺点作说明 导致有些看不懂 本人根据自己的理解 对某些优缺点做一下说明 如果理解有不对的地方 欢迎大家指正 随机森林是一个用随机方式建立的 包含多个决策树的分类器 其输出
  • Java字符串的加密解密

    为了保证程序的安全 经常采用数据加密的方法 Java 中提供了专门用于加密运算的类和接口 除了使用加密类和接口外 还可以通过多种方式实现字符串的加密 其中常用的就是获取字符串的字节数组 之后对字节数组中的每个字节都进行运算 得到新的内容 这
  • 程序的组成部分

    程序的组成部分 如上图所示 程序由 code 到 stack 地址由小到大 text 之前有一段不可读的区域 text rodata data bss heap stack 的大小是在程序编译阶段确定的 text 段 存放程序代码的区域 r