C程序的内存布局分析

C 程序的典型内存由以下部分组成:

  1. 文本段(text)
  2. 初始化数据段 (data)
  3. 未初始化数据段(bss)
  4. 堆 (heap)
  5. 栈(stack)

典型内存布局:

1.文本段: 文本段,也称为代码段或简称为文本,是目标文件或内存中的程序部分之一,其中包含可执行指令。作为内存区域,文本段可以放置在堆或堆栈下方,以防止堆和堆栈溢出覆盖它。 通常,文本段是可共享的,因此对于频繁执行的程序(例如文本编辑器、C 编译器、shell 等),内存中只需要保留一个副本。此外,文本段通常是只读的,以防止程序意外修改其指令。

2.初始化数据段: 初始化数据段,通常简称为数据(data)段。数据段是程序虚拟地址空间的一部分,其中包含由程序员初始化的全局变量和静态变量。请注意,数据段不是只读的,因为变量的值可以在运行时更改。该段又可以分为初始化只读区和初始化读写区。
例如,C 中 char s[] = “hello world” 定义的全局字符串以及 main(即全局)之外的 int debug=1 这样的 C 语句将存储在初始化的读写区域中。而像 const char* string = “hello world” 这样的全局 C 语句使得字符串文字“hello world”存储在初始化的只读区域中,而字符指针变量 string 存储在初始化的读写区域中。
例如: static int i = 10 将存储在数据段中,全局 int i = 10 也将存储在数据段中

3. 未初始化数据段: 未初始化数据段通常称为“ bss ”段,以一个古老的汇编运算符命名,代表“由符号开始的块”。该段中的数据在程序开始执行之前被内核初始化为算术0。未初始化的数据从数据段末尾开始,包含所有初始化为零或源代码中没有显式初始化的全局变量和静态变量。
例如,声明一个变量 static int i; 将包含在 BSS 段中。 
例如,声明了一个全局变量 int j;将包含在 BSS 段中。

4. 栈: 栈区传统上与堆区相邻,并以相反的方向增长;当堆栈指针遇到堆指针时,可用内存就耗尽了。利用现代的大地址空间和虚拟内存技术,它们几乎可以放置在任何地方,但它们通常仍然以相反的方向增长。堆栈区域包含程序堆栈,一种后进先出的结构,通常位于内存的较高部分。在标准PC x86计算机架构上,它向地址零增长;在其他一些架构上,它以相反的方向增长。“堆栈指针”寄存器跟踪堆栈顶部;每次将值“推入”堆栈时都会对其进行调整。为一个函数调用推送的一组值称为“堆栈帧”;堆栈帧至少包含一个返回地址。堆栈,存储自动变量以及每次调用函数时保存的信息。每次调用函数时,返回位置的地址以及有关调用者环境的某些信息(例如一些机器寄存器)都保存在堆栈中。然后,新调用的函数在堆栈上为其自动变量分配空间。这就是 C 中的递归函数的工作原理。每次递归函数调用自身时,都会使用一个新的堆栈帧,因此一组变量不会干扰函数另一个实例中的变量。

5. 堆: 堆是通常发生动态内存分配的段。堆区域从 BSS 段的末尾开始,并从那里增长到更大的地址。堆区域由 malloc、realloc 和 free 管理,它们可以使用 brk 和 sbrk 系统调用来调整其大小(请注意,使用 brk/sbrk 和单个“堆区域”并不需要履行合同malloc/realloc/free;它们也可以使用 mmap 来实现,以将虚拟内存的潜在非连续区域保留到进程的虚拟地址空间中)。堆区域由进程中的所有共享库和动态加载的模块共享。

以下是一个说明的例子:

#include <stdio.h>static unsigned int val1 = 1;        //val1存放在.data段
unsigned int val2 = 1;               //初始化的全局变量存放在.data段
unsigned int val3 ;                  //未初始化的全局变量存放在.bss段
const unsigned int val4 = 1;         //val4存放在.rodata(只读数据段)unsigned char Demo(unsigned int num) //num 存放在栈区
{char var = "123456";               //var存放在栈区,"123456"存放在常量区unsigned int num1 = 1 ;            //num1存放在栈区static unsigned int num2 = 0;      //num2存放在.data段const unsigned int num3 = 7;       //num3存放在栈区void *p;p = malloc(8);                     //p存放在堆区free(p);return 1;
}void main()
{unsigned int num = 0 ;num = Demo(num);                   //Demo()函数的返回值存放在栈区。
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/201205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

极智芯 | 解读国产AI算力 沐曦产品矩阵

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文分享一下 解读国产AI算力 沐曦产品矩阵。 2020 年是国产 AI 芯片创业爆发的一年,GPU 市场竞争激烈,外有英伟达、AMD、高通等巨头,内有天数智芯、璧仞科技、摩尔线程等新锐,再加上华为昇腾…

网页产品经理常用的ChatGPT通用提示词模板

产品策略&#xff1a;请帮助我制定一个网页产品的产品策略。 市场调研&#xff1a;如何进行网页产品的市场调研&#xff1f; 用户需求&#xff1a;如何确定网页产品的用户需求&#xff1f; 产品设计&#xff1a;如何设计一个优秀的网页产品&#xff1f; 用户体验&#xff1…

tomcat 有哪几种Connector 运行模式(优化)?

Tomcat 的 Connector 用于处理 HTTP 请求&#xff0c;它决定了 Tomcat 如何与 Web 应用程序进行交互。在 Tomcat 中&#xff0c;Connector 有多种类型&#xff0c;并且每种类型都有不同的运行模式和优化选项。以下是一些常见的 Connector 类型及其运行模式&#xff1a; HTTP/1…

Java 控制台命令导入本地jar包到maven本地库中

1、新建POM文件&#xff0c;在maven库路径下创建POM文件 注意&#xff1a;这个路径需要与第2点导入命令中的grouoId、artifactId和version写法对应 Path&#xff1a;D:\RomanData\repository\com\sae\mail\1.0.0\mail-1.0.0.pom <?xml version"1.0" encoding&q…

基于web的ssm邮票鉴赏系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把邮票鉴赏管理与现在网络相结合&#xff0c;利用java技术建设邮票鉴赏系统&#xff0c;实现邮票鉴赏的信息化。则对于进一步提高邮票鉴赏管理发展&#xff0c;丰富邮票鉴赏管理经验能起到不少的促进作用。 邮票鉴赏系统能够通过互…

【Backbone】TransNeXt:最新ViT模型(原理+常用神经网络汇总)

文章目录 一、近几年神经网络 Backbone 回顾1.Densenet 与 Resnet2.CBP3.SENet4.GCNet5.DANet6.PANet 与 FPN7.ASPP8.SPP-net9.PSP-net10.ECA-Net 二、TransNeXt&#xff08;2023&#xff09;1.提出问题2.Aggregated Pixel-focused Attention2.1 Pixel-focused Attention&#…

Ant Design Vue(v1.7.8)a-table组件的插槽功能

<template slot"unitShow" slot-scope"text, record"> slot"unitShow" 表示插槽名&#xff08;见具名插槽&#xff09; slot-scope"text, record" 表示作用域插槽接收从<a-table>组件传递进来的两个参数&#xff0c;其中…

CentOS8下的JDK安装

一、JDK简介 &#xff08;一&#xff09;JDK、JRE、JVM、JIT 1、JDK&#xff08;Java Development kit&#xff09;&#xff0c;针对Java开发人员的产品&#xff0c;它包括了Java运行环境JRE、Java工具和Java基础类库&#xff0c;是java开发工具包。 java标准版开发工具包&am…

机器连接和工业边缘计算

软件应用和IT创新是制造业投资的主要驱动力。解决方案架构应围绕特定标准进行整合&#xff0c;并采用架构蓝图和最佳实践来满足最终用户的需求。此外&#xff0c;边缘计算&#xff08;Edge Computing&#xff09;也将在制造业中加速部署。 边缘计算是制造业的下一个变革驱动力。…

电商系统重要概念SPU、SKU、基本属性、销售属性

1. 什么是SPU&#xff1f;什么是SKU&#xff1f; SPU 和 SKU 是两个常用于零售和库存管理的术语&#xff0c;它们分别代表了不同的商品分类层次。 SPU&#xff08;Standard Product Unit&#xff0c;标准产品单元&#xff09;&#xff1a;SPU 指的是一种基于其功能或属性进行分…

解决vue ssr服务端渲染运行时报错:net::ERR_PROXY_CONNECTION_FAILED

现象&#xff1a; 从代码里找了半天也没有找到问题&#xff0c;但是由于ssr服务端渲染配置本身非常复杂&#xff0c;步骤又繁琐&#xff0c; 而且报错又很多&#xff0c;不知道哪里出了问题。 感觉是header或者cookie丢失造成的&#xff0c;因为据说ssr本身有这样的缺陷&…

Python---对象的属性添加与获取

1、什么是属性 在Python中&#xff0c;任何一个对象都应该由两部分组成&#xff1a;属性 方法 属性即是特征&#xff0c;比如&#xff1a;人的姓名、年龄、身高、体重…都是对象的属性。 车的品牌、型号、颜色、载重量...都是对象的属性。 对象属性既可以在类外面添加和获…

CCKS2023-面向金融领域的主体事件检测-亚军方案分享

赛题分析 大赛地址 https://tianchi.aliyun.com/competition/entrance/532098/introduction?spma2c22.12281925.0.0.52b97137bpVnmh 任务描述 主体事件检测是语言文本分析和金融领域智能应用的重要任务之一&#xff0c;如在金融风控领域往往会对公司主体进行风险事件的检测…

uniapp的subnvue苹果适配(ios)谷歌地图问题

谷歌地图&#xff0c;google地图&#xff0c;调整宽度。这个适配花了点时间&#xff0c;苹果IOS宽度一直无效失灵&#xff0c;赶紧记录分享&#xff0c;很坑。可能所有的ios的subnvue适配都这样。看了网上很多方法无效&#xff0c;最终找到试出答案。 pages.json的配置宽度无效…

logging 日志完整应用实例

日志文件函数&#xff1a;日志相关设置 logfile.py import logging def logg():# LOG_FORMAT "%(asctime)s - %(levelname)s - %(message)s"LOG_FORMAT "%(asctime)s - %(levelname)s - %(filename)s, line:%(lineno)d - %(message)s" # 带有文件名、行…

Linux使用root用户安装完MySQL软件后,配置MySQL这个普通用户登录

在 Linux 系统中&#xff0c;当您使用 root 用户安装 MySQL 后&#xff0c;系统会自动创建一个名为 mysql 的系统用户。这个 mysql 用户主要用于管理 MySQL 服务的运行&#xff0c;通常是没有登录系统的权限的。如果您希望使这个 mysql 用户能够登录到系统&#xff0c;您需要设…

解决ssr服务端渲染程序启动报错: ReferenceError: location is not defined

现象&#xff1a; 原因&#xff1a;chatgpt给出的解释很到位&#xff1a; 该错误表明代码尝试访问 location 对象&#xff0c;该对象通常在浏览器环境中可用。 然而&#xff0c;你的服务器端代码正在 Node.js 环境中运行&#xff0c;而在这个环境中 location 对象未定义。 问…

【总结】ES 7.x 配置用户名和密码访问(亲测可用)

目录 1.关闭es分片迁移2.修改配置文件,开启x-pack验证3.重启elasticsearch服务4.生成CA授权证书,配置certs5.修改es配置文件,追加以下内容6.再次重启ES每个节点。7.执行设置用户名和密码的命令8.最后放开es分片迁移9.FQA9.1 Postman 访问不了ES9.2 curl 访问不了ES9.3 elast…

踩坑记录:uniapp中scroll-view的scroll-top不生效问题;

情景描述&#xff1a; 最近在uniapp项目中用到scroll-view内置组件&#xff0c;有需求是在页面下拉刷新后&#xff0c;让scroll-view组件区域的显示内容置顶&#xff0c;也就是scroll-view区域的内容恢复不滑动的状态&#xff1b; 补充&#xff1a;下拉刷新操作scroll-view组件…

案例046:基于微信小程序的云上考场

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…