C内存模型

news/2025/2/22 10:14:46/文章来源:https://www.cnblogs.com/after-tipsy/p/18730613

分区

在C语言中,内存被分为以下几个部分

.text 代码段,存放程序的可执行代码,不可修改

.rodata(Read Only Data) 常量区,存放全局常量

.data 数据段,存放已初始化的全局变量和静态变量

.bss(Block Started By Symbol) 未初始化数据段,存放未初始化的全局变量或者初始化为0的全局变量和静态变量

heap 堆区,在内存中总体从低地址向高地址增长,不一定是连续的,由程序员动态申请,在程序运行时才开辟内存空间

stack 栈区,在内存中由高地址向低地址增长,保存程序栈帧,栈帧里包含函数返回地址、函数参数、函数内部定义的变量

如下图:

C内存模型绘图

解释

以下面这段代码为例:

#include<stdio.h>
#include<stdlib.h>char c1;	//字符变量c1未被初始化,全局变量编译器默认初始化为空格,放入bss段中
char c2='a';	//字符变量c2被初始化为'a',放入data数据段中const int i1=1;	//整形变量被const修饰,为常量,放入rodata只读数据段中int main(int argc, char const *argv[]){	//main函数及其调用的子函数的内部变量、参数、返回地址,在程序运行时动态放入栈区中int *ip=(int*)malloc(5*sizeof(int));	//这里是在运行时动态申请内存,申请的内存放在堆区中...
}//以上整个代码编译后的二进制数据,放入text代码区中

更复杂的情况如下,函数中一个字符串常量赋值给一个字符串数组,类似于下面代码:

int fun(){char s[]="Hero";...return 0;
}

字符串“Hero”是常量,放在在.rodata只读数据段里的,但是一个函数在被调用时会在栈区形成一个栈帧,它包含了函数内部定义的变量,所以字符数组s会在fun函数被调用时从.rodata里复制“Hero”到栈区中字符数组s的地址,“Hero”大小为5个字节(包含‘\0’),栈区中的字符数组s也是5个字节

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

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

相关文章

探秘Transformer系列之(5)--- 训练推理

从零开始解析Transformer,目标是:(1) 解析Transformer如何运作,以及为何如此运作,让新同学可以入门;(2) 力争融入一些比较新的或者有特色的论文或者理念,让老鸟也可以有所收获。探秘Transformer系列之(5)--- 训练&推理 0x00 概述 Transformer训练的目的是通过对输入…

124. 二叉树中的最大路径和(困难)

目录题目题解:后序遍历 题目二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root ,返回…

Windsurf AI编程工具

Windsurf AI编程工具实操指南目录一、环境搭建与核心功能安装与登录模型选择与配置中文环境配置二、开发全流程实操创建项目将api目录下的模型调用抽象为服务层三、避坑指南四、与Cursor对比结语安装包 一、环境搭建与核心功能 安装与登录 访问Windsurf官网下载适配版本,支持W…

让你搜索效率翻倍的技巧

本文是《最全面的浏览器教程》第五篇,介绍一些好用的搜索引擎技巧。​ 本文是《最全面的浏览器教程》第五篇,介绍一些好用的搜索引擎技巧。 上一篇文章推荐了很多好用的搜索引擎,但要用好它们,还得加上很多技巧:例如指定文件类型,排除某些内容,在指定域名内搜索等。 本文…

4. MySQL 逻辑架构说明

4. MySQL 逻辑架构说明 @目录4. MySQL 逻辑架构说明1. 逻辑架构剖析1.1 服务器处理客户端请求1.2 Connectors(连接器)1.3 第1层:连接层1.4 第2层:服务层1.5 第3层:引擎层1.6 存储层2. SQL执行流程2.1 MySQL 中的 SQL 执行流程2.2 MySQL8中SQL执行原理最后:1. 逻辑架构剖析…

无线充电

https://baijiahao.baidu.com/s?id=1809048563048631142&wfr=spider&for=pc 工信部放宽无线充电设备频率和功率限制,安卓厂商或加大无线充电功率,苹果则因Qi2.0标准频率与航空无线电导航业务冲突而调整。无线充电技术发展迅速,但仍需解决充电发热等问题。咱也就是说…

陪玩平台搭建,利用Redis实现多级缓存

陪玩平台搭建,利用Redis实现多级缓存如何使用redis6客户端缓存前置条件: redis服务端版本必须是>=6。lettuce版本>=6 目前java的redis客户端找了一圈,貌似只有lettuce 6支持,其他客户端估计后期会支持1、项目中pom引入lettuce GAV<dependency><groupId>i…

《DeepSeek中小学生/家长使用手册》让因材施教不再是选择题!

最近有受到粉丝私信如何在小初高的学习中使用DeepSeek来提供成绩;确实,随着教育改革的推进,学习内容日益丰富且难度加大,许多家长在辅导孩子和沟通交流方面感到困扰。无论是学生还是家长,找到合适的学习与辅导方式至关重要。尽管市面上有多种培训机构和学习工具可供选择,…

读DAMA数据管理知识体系指南01数据管理(上)

数据管理对企业至关重要,需规划、协作和领导力,确保数据质量和隐私,支撑企业决策和运营,数据是组织资产,需全生命周期管理,高质量数据带来竞争优势。1. 数据管理 1.1. 数据是一种至关重要的企业资产1.1.1. 数据和信息能使他们洞察顾客、产品和服务,帮助企业创新并实现其…

推荐几款开源且免费的 .NET MAUI 组件库

前言 今天大姚给大家推荐 3 款开源且免费的 .NET MAUI 组件库。 .NET MAUI介绍 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。.…

dotnet 在 VisualStudio 一键 F5 启动调试 Roslyn 分析器项目

本文将告诉大家如何在 VisualStudio 里面,一键使用习惯的 F5 键进行快速构建和启动调试 Roslyn 分析器项目在 dotnet 里面编写的 SourceGenerator 源代码生成器,或者是分析器时,可能编写的逻辑比较复杂,期望制作一个项目进行调试。或者是原本分析器能够跑得好好的,莫名就在…

dotnet OpenXML 已知问题 设置 0x0001 等 XML 不合法字符给到标题将在保存时抛出异常

本文记录 OpenXML 的已知问题,在 `PackageProperties.Title` 等属性上设置字符串包含如 Unicode 编码为 0x0001 等 XML 不合法字符,将在保存写入文件时,抛出 ArgumentException 异常此问题报告给了官方: https://github.com/dotnet/Open-XML-SDK/issues/1874 最简复现代码:…