当前位置: 首页 > article >正文

【C语言】讲解 程序分配的区域(新手)

目录

代码区

数据区

堆区 

 栈区

 常量区

重点比较一下堆区与 栈区 

总结:


 

前言:

C语言程序的内存分配区域是理解其运行机制的重要部分。根据提供的多条证据,我们可以总结出C语言程序在运行时主要涉及以下五个关键内存区域: 代码区、 数据区 、 堆区 、 栈区  和 常量区。这些区域各自承担不同的功能,。

那么本章节为大家讲解定义,作用和特点。

堆区,栈区在动态内存的习题章节出现过,不知道大家是否还记得。

这个问题留的在最后,看完本章节,就两字  通透。

代码区

  • 定义:代码区存储程序的机器代码,即编译后的二进制指令。这部分内存通常是只读的,以防止程序意外修改自身的指令。
  • 作用:CPU在执行程序时,会从代码区加载指令并依次运行。代码区的内容在程序运行期间不会改变。

    查看

  • 特点:代码区通常位于内存的低地址部分,操作系统负责加载和保护该区域

数据区

  • 定义:数据区分为已初始化数据区和未初始化数据区。已初始化数据区存储全局变量和静态变量,而未初始化数据区存储全局未初始化变量。
  • 作用:存储程序运行时需要保留的数据,包括全局变量和静态变量。这些变量在整个程序运行期间都存在,并在程序结束时被释放。
  • 特点:数据区是只读或可读写的区域,具体取决于变量是否被初始化。

堆区 

  • 定义:堆区用于动态内存分配,程序员通过函数如malloccallocrealloc等分配内存空间,用于存储运行时需要额外分配的变量。
  • 作用:动态分配的内存可以在程序运行过程中随时调整大小或释放。堆区的管理较为灵活,但如果不及时释放可能导致内存泄漏。

    查看

  • 特点:堆区的内存分配方式类似于链表,分配和释放较为复杂,且容易产生碎片

 栈区

  • 定义:栈区用于存储函数调用时的局部变量、函数参数以及返回地址等信息。栈区由编译器自动分配和释放,通常在函数调用结束后立即释放。
  • 作用:栈区主要用于存放生命周期较短的变量,如局部变量和形参。它支持快速分配和释放,因此非常适合处理短期数据。
  • 特点:栈区的内存分配方式类似于数据结构中的栈,遵循“先进后出”的原则。栈区的大小通常较小且连续,但其容量有限,如果过度使用可能导致栈溢出。

 常量区

  • 定义:常量区存储程序中定义的字符串常量和其他只读数据。
  • 作用:常量区中的数据通常是只读的,例如字符串字面量或符号常量。这些数据在程序运行期间不会被修改。
  • 特点:常量区的数据通常位于内存的高地址部分,且在程序结束时不会被释放。

重点比较一下堆区与 栈区 

存储内容不同

栈:在函数调用时,栈中存放的是函数中各个参数(局部变量)。栈底下是函数调用后的下一条指令。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

管理方式上不同

栈:由系统自动分配空间,同时系统自动释放空间。例如,声明在函数中一个局部变量“int b“。系统自动在栈中为b开辟空间,当对应的生存周期结束后栈空间自动释放。

堆:需要程序员手动申请并且手动释放,并指明大小。在C语言中malloc函数申请,释放free函数,在C++中new和delete实现。

空间大小不同

栈:获取空间较小。在Windows下,一般大小是1M或2M,当剩余栈空间不足时,分配失败overflow。

堆:获得空间根据系统的有效虚拟内存有关,比较灵活,比较大。

能否产生碎片不同

栈:不会产生碎片,空间连续。

堆:采用的是链表的存储方式,会产生碎片。

生长方向不同

栈:向低地址扩展的数据结构,是一块连续的内存的区域。

堆:向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。

分配方式不同

栈:有2种分配方式——静态分配和动态分配。静态由编译器完成,例如局部变量;动态由alloca函数实现,并且编译器会进行释放。

堆:都是动态分配的,没有静态分配的堆。

分配效率不同

栈:由系统自动分配,速度较快。但程序员是无法控制的。

堆:由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来方便。

总结:

1.栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。


2.堆:用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一直占着不放,导致内存泄露。


3.全局区/静态区:用来存放全局变量和静态变量。程序结束时由系统释放,分为全局初始化区和全局未初始化区;存在于程序的整个运行期间,是由编译器分配和释放的。


4.常量区:常量字符串放于此,程序结束时由系统释放。例如char *str=”hello_world”;则”hello_world”为文字常量,存放于文字常量区。也由编译器控制分配和释放。


5.代码区:用来存放程序的二进制代码。

提供一个代码,供大家理解 

#include <stdlib.h>
#include <string.h>int a = 0; char *p1;
int main()
{int b; //栈char arr[] = "abc"; char *p2; //栈char *p3 = "123456"; static int c =0; p1 = (char *)malloc(10); p2 = (char *)malloc(20); strcpy(p1, "123456"); return 0;
}

 答案如下:

#include <stdlib.h>
#include <string.h>int a = 0; //全局初始化区char *p1; //全局未初始化区int main()
{int b; //栈char arr[] = "abc"; //  arr在栈,"abc\0"在常量区char *p2; //栈char *p3 = "123456"; //  "123456\0"在常量区,p3在栈上static int c =0; //全局区p1 = (char *)malloc(10); //p1在栈,分配的10字节在堆p2 = (char *)malloc(20); //p2在栈,分配的20字节在堆strcpy(p1, "123456"); //"123456"放在常量区,编译器可能会优化为和p3的指向同一块区域return 0;
}

相关文章:

【C语言】讲解 程序分配的区域(新手)

目录 代码区 数据区 堆区 栈区 常量区 重点比较一下堆区与 栈区 总结&#xff1a; 前言&#xff1a; C语言程序的内存分配区域是理解其运行机制的重要部分。根据提供的多条证据&#xff0c;我们可以总结出C语言程序在运行时主要涉及以下五个关键内存区域&#xff1a; 代…...

【脚本 完全参数化的通用 APT 源配置方案-Debian/Ubuntu】

通过脚本在 Debian/Ubuntu 系统上一键切换 APT 源 如Dockerfile中 使用某个源&#xff08;比如 aliyun&#xff09; 假设你的目录结构是&#xff1a; . ├── Dockerfile └── switch-apt-source.shFROM ubuntu:22.04# 把脚本拷贝到镜像中 COPY switch-apt-source.sh /us…...

数据集笔记:SeekWorld

提出了一项新任务&#xff1a;地理定位推理&#xff08;Geolocation Reasoning&#xff09; 该任务要求模型在感知视觉信息的同时&#xff0c;推理出图像中视觉语义所隐含的高级逻辑关系&#xff0c;从而确定图像的拍摄地点 TheEighthDay/SeekWorld at main 构建了一个基于规则…...

LeetCode 算 法 实 战 - - - 移 除 链 表 元 素、反 转 链 表

LeetCode 算 法 实 战 - - - 移 除 链 表 元 素、反 转 链 表 第 一 题 - - - 移 除 链 表 元 素方 法 一 - - - 原 地 删 除方 法 二 - - - 双 指 针方 法 三 - - - 尾 插 第 二 题 - - - 反 转 链 表方 法 一 - - - 迭 代方 法 二 - - - 采 用 头 插 创 建 新 链 表 总 结 &a…...

Jenkins实践(10):pipeline构建历史展示包名和各阶段间传递参数

Jenkins实践(10):构建历史展示包名和pipeline各阶段间传递参数 1、构建历史展示包名 参考:https://blog.csdn.net/fen_fen/article/details/148167868 1.1、方法说明 Jenkins版本:Jenkins2.452 通过修改 currentBuild.displayName 和 currentBuild.description 实现: …...

从头认识AI-----循环神经网络(RNN)

前言 前面我们讲了传统的神经网络&#xff0c;如MLP、CNN&#xff0c;这些网络中的输入都被单独处理&#xff0c;没有上下文之间的信息传递机制&#xff0c;这在处理序列数据&#xff08;如语音、文本、时间序列&#xff09;时很鸡肋&#xff1a; 如何理解一句话中“前后文”的…...

配置远程无密登陆ubuntu服务器时无法连接问题排查

配置远程无密登陆ubuntu服务器时无法连接问题排查 登陆端排查服务器端登陆排查 登陆端排查 ssh -v 用户名Ubuntu服务器IP可能日志输出 debug1: Authentications that can continue: publickey,password服务器端登陆排查 sudo tail -f /var/log/auth.log可能日志输出 Authen…...

5.31 数学复习笔记 22

前面的笔记&#xff0c;全部写成一段&#xff0c;有点难以阅读。现在改进一下排版。另外&#xff0c;写笔记实际上就是图一个放松呢&#xff0c;关键还是在于练习。 目前的计划是&#xff0c;把讲义上面的高数例题搞清楚之后&#xff0c;大量刷练习册上面的题。感觉不做几本练…...

kafka学习笔记(三、消费者Consumer使用教程——使用实例及及核心流程源码讲解)

1.核心概念与架构 1.1.消费者与消费者组 Kafka消费者是订阅主题&#xff08;Topic&#xff09;并拉取消息的客户端实例&#xff0c;其核心逻辑通过KafkaConsumer类实现。消费者组&#xff08;Consumer Group&#xff09;是由多个逻辑关联的消费者组成的集合。 核心规则 同一…...

鸿蒙 Form Kit(卡片开发服务)

Form Kit&#xff08;卡片开发服务&#xff09; 鸿蒙应用中&#xff0c;Form / Card / Widget 都翻译为“卡片” Form Kit&#xff08;卡片开发服务&#xff09;提供一种界面展示形式&#xff0c;可以将应用的重要信息或操作前置到服务卡片&#xff0c;以达到服务直达、减少跳转…...

算力卡上部署OCR文本识别服务与测试

使用modelscope上的图像文本行检测和文本识别模型进行本地部署并转为API服务。 本地部署时把代码中的检测和识别模型路径改为本地模型的路径。 关于模型和代码原理可以参见modelscope上这两个模型相关的页面&#xff1a; iic/cv_resnet18_ocr-detection-db-line-level_damo iic…...

KWIC—Implicit Invocation

KWIC—Implicit Invocation ✏️ KWIC—Implicit Invocation 文章目录 KWIC—Implicit Invocation&#x1f4dd;KWIC—Implicit Invocation&#x1f9e9;KWIC&#x1f9e9;核心组件&#x1f9e9;ImplementationScheme⚖️ 隐式调用 vs 显式调用对比 &#x1f31f; 总结 &#x…...

Visual Studio 2022 发布独立的 exe 文件

我们在用 Visual Studio 2022 写好一个 exe 程序之后&#xff0c;如果想把这个拿到其他地方运行&#xff0c;需要把 exe 所在的文件夹一起拿过去。 编译出来的 exe 文件需要其他几个文件一同放在同一目录才能运行&#xff0c;原因在于默认情况下&#xff0c;Visual Studio 是把…...

11.4java语言执行浅析4

编译成字节码&#xff08;.class 文件&#xff09; 使用 javac 命令将源代码编译为 Java 字节码&#xff08;bytecode&#xff09; 它不是机器码&#xff0c;而是 JVM 能理解的中间语言&#xff08;字节码&#xff09;&#xff0c;具有平台无关性。 编译过程简要&#xff1…...

Excel 操作 转图片,转pdf等

方式一 spire.xls.free&#xff08;没找设置分辨率的方法&#xff09; macOs开发Java GUI程序提示缺少字体问题解决 Spire.XLS&#xff1a;一款Excel处理神器_spire.xls免费版和收费版的区别-CSDN博客 官方文档 Spire.XLS for Java 中文教程 <dependency><groupI…...

说说 Kotlin 中的 Any 与 Java 中的 Object 有何异同?

在 Kotlin 中 Any 类型和 Java 中的 Object 类都是所有类型的根类型。 1 基本定义 Kotlin 中的 Any 和 Any?&#xff1a; Any&#xff1a;是所有非空类型的根类型&#xff1b;Any?&#xff1a;是所有可空类型的根类型&#xff1b; Java 中的 Object&#xff1a; 是所有类…...

python分配方案数 2023年信息素养大赛复赛/决赛真题 小学组/初中组 python编程挑战赛 真题详细解析

python分配方案数 2023全国青少年信息素养大赛Python编程挑战赛复赛真题解析 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解...

《信号与系统》第 5 章 离散时间傅里叶变换

5.0 引言 这一章将介绍并研究离散时间傅里叶变换&#xff0c;这样就完整地建立了傅里叶分析方法。 5.1 非周期信号的表示&#xff1a;离散时间傅里叶变换 5.1.1 离散时间傅里叶变换的导出 在第4章看到&#xff1a;一个连续时间周期方波的傅里叶级数可以看成一个包络函数的采…...

动态IP与区块链:重构网络信任的底层革命

在数字经济蓬勃发展的今天&#xff0c;网络安全与数据隐私正面临前所未有的挑战。动态IP技术与区块链的深度融合&#xff0c;正在构建一个去中心化、高可信的网络基础设施&#xff0c;为Web3.0时代的到来奠定基础。 一、技术碰撞&#xff1a;动态IP与区块链的天然契合 动态I…...

目前主流图像分类模型的详细对比分析

以下是目前主流图像分类模型的详细对比分析&#xff0c;结合性能、架构特点及应用场景进行整理&#xff1a; 一、主流模型架构分类与定量对比 模型名称架构类型核心特点ImageNet Top-1准确率参数量&#xff08;百万&#xff09;计算效率典型应用场景ResNetCNN残差连接解决梯度…...

uniapp使用Canvas生成电子名片

uniapp使用Canvas生成电子名片 工作中有生成电子名片的一个需求&#xff0c;刚刚好弄了发一下分享分享 文章目录 uniapp使用Canvas生成电子名片前言一、上代码&#xff1f;总结 前言 先看效果 一、上代码&#xff1f; 不对不对应该是上才艺&#xff0c;哈哈哈 <template…...

世冠科技亮相中汽中心科技周MBDE会议,共探汽车研发数字化转型新路径

近日&#xff0c;中汽中心2025年科技周MBDE前沿应用主题会议在天津成功举办。本次会议以“智汇津门共探MBDE前沿应用新征程”为主题&#xff0c;聚焦基于模型的数字工程&#xff08;MBDE&#xff09;方法论在汽车复杂系统研发中的创新实践与跨领域协同&#xff0c;旨在推动行业…...

Linux笔记---线程

1. 线程的介绍 1.1 线程的概念 基本定义&#xff1a; 线程&#xff08;Thread&#xff09;是操作系统能够进行运算调度的最小单位。它被包含在进程&#xff08;Process&#xff09;之中&#xff08;或者说是进程的一部分、对进程的划分&#xff09;&#xff0c;是进程中的实际…...

MCP架构深度解析:从基础原理到核心设计

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…...

【监控】pushgateway中间服务组件

Pushgateway 是 Prometheus 生态中的一个中间服务组件&#xff0c;以独立工具形式存在&#xff0c;主要用于解决 Prometheus 无法直接获取监控指标的场景&#xff0c;弥补其定时拉取&#xff08;pull&#xff09;模式的不足。 其用途如下&#xff1a; 突破网络限制&#xff1…...

数据库暴露--Get型注入攻击

1.背景知识 1.1Post、Get的对比 特性GET 方法POST 方法HTTP 方法类型GETPOST数据位置URL 查询字符串(?key=value)请求体(Request Body)数据可见性明文显示在 URL 和浏览器历史中不可见(除非开发者工具查看)数据长度限制受 URL 长度限制(通常约 2048 字符)无明确限制(…...

AI炼丹日志-26 - crawl4ai 专为 AI 打造的爬虫爬取库 上手指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇&#xff1a; MyBatis 更新完毕目前开始更新 Spring&#xff0c;一起深入浅出&#xff01; 大数据篇 300&#xff1a; Hadoop&…...

ESP32-idf学习(四)esp32C3驱动lcd

一、前言 屏幕是人机交互的重要媒介&#xff0c;而且现在我们产品升级的趋势越来越高大尚&#xff0c;不少产品都会用lcd来做界面&#xff0c;而esp32c3在一些项目上是可以替代主mcu&#xff0c;所以驱动lcd也是必须学会的啦 我新买的这块st7789&#xff0c;突然发现是带触摸…...

【python】uv管理器

uv是一个速度极快的 Python 包和项目管理器&#xff0c;用 Rust 编写。 安装 安装uv之前&#xff0c;确保你的电脑不需要安装了python 在Windows下&#xff0c;可以使用官方的脚本直接安装 powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.…...

关于Web安全:7. WebShell 管理与持久化后门

一、菜刀马 菜刀马&#xff08;ChinaZ WebShell&#xff09; 是一种与“中国菜刀&#xff08;ChinaZ&#xff09;”客户端配合使用的 WebShell 木马&#xff0c;广泛应用于 Web 渗透测试中&#xff0c;主要使用 PHP/ASP/JSP 等语言编写。 它的本质是一个一句话木马&#xff0…...