三、重学C++—C语言内存管理

news2025/3/25 11:58:55

上一章节:

二、重学C++—C语言核心-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146191640?spm=1001.2014.3001.5502

本章节代码:

cPart2 · CuiQingCheng/cppstudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/cppstudy/tree/master/cPart2

cMemory.c

一、引言

在 C 语言的编程世界里,内存管理是基石般的存在。想象一下,内存就如同一个巨大的仓库,程序中的各种数据都存放在这个仓库的不同区域。合理地管理内存,就像是巧妙地安排仓库中的货物摆放,能让程序高效、稳定地运行。接下来,我们就深入探究 C 语言中内存的分区和管理。

二、内存分区

C 语言程序运行时,内存主要分为 栈区、堆区、全局区(静态区)、常量区和代码区。
  • 栈区(Stack):这就像一个自动整理的书架,函数调用时,局部变量、参数等会像书一样依次被放到书架上(入栈);函数执行完,这些书又会按照相反的顺序被拿走(出栈),操作系统会自动管理这个书架,速度非常快;
  • 堆区(Heap):类似于一个自由市场,程序员可以根据需要在这里租摊位(申请内存),用完后再把摊位还回去(释放内存)。但这个市场比较自由,管理起来需要程序员自己多操心。
  • 全局区(静态区,Global/Static):可以看作是一个公共仓库,全局变量和静态变量都存放在这里。这个仓库又分为两个区域,一个放已经初始化的货物(已初始化全局区),另一个放还没准备好的货物(未初始化全局区,BSS)。
  • 常量区(Constant):如同一个保险箱,里面存放着常量字符串等不可修改的数据。一旦数据放进去,就不能再改变,保证了数据的安全性。
  • 代码区(Code):相当于程序的剧本存放着程序的二进制代码,也就是编译后的机器指令。这个剧本是只读的,防止在演出过程中被意外修改。

三、可执行文件的内存划分

Text段,Date段,Bss段

四、堆与栈的区别

1、申请方式

  • 栈:栈内存由操作系统自动分配和释放。当函数被调用时,操作系统会自动为函数的局部变量和参数分配栈空间;函数返回时,这些空间会自动释放。
  • 堆:堆内存需要程序员手动申请和释放。使用malloccallocrealloc等函数来申请堆内存,使用free函数来释放, C++里面是用new / delete,申请释放

2、申请响应效率对比

  • 栈:栈的申请和释放速度非常快,因为操作系统只需要移动栈指针就可以完成操作,就像在书架上快速地拿放书一样。
  • 堆:堆的申请和释放相对较慢,因为需要操作系统进行复杂的内存管理操作,比如寻找合适的空闲内存块等,就像在自由市场中找合适的摊位一样。

3、存储效率对比

  • 栈:栈内存的存储效率高,因为数据的访问是连续的,符合计算机的缓存机制,能提高数据的读取速度。
  • 堆:堆内存的存储效率相对较低,因为频繁的申请和释放会导致内存碎片化,使得内存空间不能被充分利用。

4、异常情况列举,以及如何避免

  • 栈溢出:当栈空间被耗尽时,就会发生栈溢出错误。常见原因是递归调用过深或者局部变量占用空间过大。避免方法是控制递归深度,合理使用局部变量。
  • 内存泄漏:在堆内存管理中,如果忘记释放已经申请的内存,就会造成内存泄漏。避免方法是在使用完堆内存后,及时调用free函数释放。
实例代码:
#include <stdio.h>
#include <stdlib.h>

// 全局变量,存放在全局区
int global_var = 10;

// 未初始化的全局变量,存放在BSS区
int global_var_uninit;

// 静态变量,存放在全局区
static int static_var = 20;

// 未初始化的静态变量,存放在BSS区
static int static_var_uninit;

void func() {
    // 局部变量,存放在栈区
    int local_var = 30;
    printf("局部变量: %d\n", local_var);
}

int main() {
    // 局部变量,存放在栈区
    int local_var = 40;

    // 动态分配的内存,存放在堆区
    int *heap_var = (int *)malloc(sizeof(int));
    if (heap_var != NULL) {
        *heap_var = 50;
    }

    // 常量字符串,存放在常量区
    const char *const_str = "Hello, World!";

    printf("全局变量: %d\n", global_var);
    printf("未初始化的全局变量: %d\n", global_var_uninit);
    printf("静态变量: %d\n", static_var);
    printf("未初始化的静态变量: %d\n", static_var_uninit);
    printf("局部变量: %d\n", local_var);
    if (heap_var != NULL) {
        printf("堆区动态分配变量: %d\n", *heap_var);
        // 释放堆区内存,避免内存泄漏
        free(heap_var);
    }
    printf("常量字符串: %s\n", const_str);

    // 调用函数,观察栈区局部变量
    func();

    return 0;
}

运行结果:

下一章节:

四、重学C++—CPP基础-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146298585

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

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

相关文章

算法题(105):小猫爬山

审题&#xff1a; 本题需要我们找出将n个小猫放在有限重的缆车上运下山所需的最小缆车数 时间复杂度分析&#xff1a;本题的数据量小于等于18&#xff0c;所以我们在做好剪枝的前提下可以使用深度优先搜索解题 思路&#xff1a; 方法一&#xff1a;dfs 搜索策略&#xff1a;将小…

线程的pthread_create、pthread_join、pthread_exit、pthread_detach函数

线程的创建&#xff08;pthread_create&#xff09; pthread_t tid;//本质是unsigned long类型&#xff0c;打印时得到的是该线程的虚拟地址int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)(void*), void *arg ); pthread_t *thre…

测试专项4:AI算法测试在测试行业中,该如何定位自己自述

这岗位到底干啥的&#xff1f; 打个比方&#xff1a; 你就像AI模型的“质检员产品经理风险顾问”三合一。 质检员&#xff1a; 别人造了个AI模型&#xff08;比如人脸识别系统&#xff09;&#xff0c;你不能光看它实验室成绩好&#xff0c;得把它丢到现实里折腾&#xff1a;…

【C语言系列】数据在内存中存储

数据在内存中存储 一、整数在内存中的存储二、大小端字节序和字节序判断2.1什么是大小端&#xff1f;2.2练习2.2.1练习12.2.2练习22.2.3练习32.2.4练习42.2.5练习52.2.6练习6 三、浮点数在内存中的存储3.1练习3.2浮点数的存储3.2.1 浮点数存的过程3.2.2 浮点数取的过程 3.3题目…

【中文翻译】第12章-The Algorithmic Foundations of Differential Privacy

由于GitHub项目仅翻译到前5章&#xff0c;我们从第6章开始通过大语言模型翻译&#xff0c;并导出markdown格式。 大模型难免存在错漏&#xff0c;请读者指正。 教材原文地址&#xff1a;https://www.cis.upenn.edu/~aaroth/Papers/privacybook.pdf 12 其他模型 到目前为止&…

图解模糊推理过程(超详细步骤)

我们前面已经讨论了三角形、梯形、高斯型、S型、Z型、Π型6种隶属函数&#xff0c;下一步进入模糊推理阶段。 有关六种隶属函数的特点在“Pi型隶属函数&#xff08;Π-shaped Membership Function&#xff09;的详细介绍及python示例”都有详细讲解&#xff1a;https://lzm07.b…

datawhale组队学习-大语言模型-task5:主流模型架构及新型架构

目录 5.3 主流架构 5.3.1 编码器-解码器架构 5.3.2 因果解码器架构 5.3.3 前缀解码器架构 5.4 长上下文模型 5.4.1 扩展位置编码 5.4.2 调整上下文窗口 5.4.3 长文本数据 5.5 新型模型架构 5.5.1 参数化状态空间模型 5.5.2 状态空间模型变种 5.3 主流架构 在预训…

RAG 架构地基工程-Retrieval 模块的系统设计分享

目录 一、知识注入的关键前奏——RAG 系统中的检索综述 &#xff08;一&#xff09;模块定位&#xff1a;连接语言模型与知识世界的桥梁 &#xff08;二&#xff09;核心任务&#xff1a;四大关键问题的协调解法 &#xff08;三&#xff09;系统特征&#xff1a;性能、精度…

(C语言)习题练习 sizeof 和 strlen

sizeof 上习题&#xff0c;不知道大家发现与上一张的习题在哪里不一样嘛&#xff1f; int main() {char arr[] "abcdef";printf("%zd\n", sizeof(arr));printf("%zd\n", sizeof(arr 0));printf("%zd\n", sizeof(*arr));printf(&…

Unity Animation的其中一种运用方式

Animation是Unity的旧的动画系统&#xff0c;先说目的&#xff0c;其使用是为了在UI中播放动效&#xff0c;并且在动效播放结束后接自定义事件而设计的 设计的关键点在于&#xff0c;这个脚本不是通过Animation直接播放动画片段&#xff0c;而是通过修改AnimationState的nor…

框架的CVE漏洞利用 php类 java类 手工操作和自动化操作蓝队分析漏洞利用的流量特征

前言 php重要框架和基本的识别特征 php的主要是 tp框架 和 laravel 当然还有 yii等 tp的主要特征 1\报错信息&#xff1a; 2、图标 3、请求头 Laravel特征 1、报错信息 2、请求头 php框架CVE利用 lavarvel 工具 https://github.com/zhzyker/CVE-2021-3129 https://git…

【算法day19】括号生成——数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

括号生成 https://leetcode.cn/problems/generate-parentheses/description/ 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 左括号数必须大于右括号数&#xff0c;且小于等于n class Solution { publ…

Qt5.15.2实现Qt for WebAssembly与示例

目录 1.什么是Qt for WebAssembly&#xff1f; 1.1 什么是 WebAssembly&#xff1f; 1.2 WebAssembly 的优势 1.3 什么是 Qt for WebAssembly&#xff1f; 1.4 Qt for WebAssembly 的特点 1.5 编译过程 1.6 运行时环境 注意&#xff01;&#xff01;&#xff01;注意&am…

好吧好吧,看一下达梦的模式与用户的关系

单凭个人感觉&#xff0c;模式在达梦中属于逻辑对象合集&#xff0c;回头再看资料 应该是一个用户可以对应多个模式 问题来了&#xff0c;模式的ID和用户的ID一样吗&#xff1f; 不一样 SELECT USER_ID,USERNAME FROM DBA_USERS WHERE USERNAMETEST1; SELECT ID AS SCHID, NA…

HOW - DP 动态规划系列(三)(含01背包问题)

目录 一、01背包问题最直接的暴力解法动态规划解法 二、完全背包 通过几个算法的学习&#xff0c;理解和掌握动态规划来解决背包问题。 一、01背包问题 对于面试的话&#xff0c;掌握01背包和完全背包就够用了&#xff0c;最多可以再来一个多重背包。 如果这几种背包分不清&…

在linux服务器部署Heygem

前言&#xff1a; Heygem官方文档上提供了基于windwos系统的安装方案。在实际使用过程中个人电脑的配置可能不够。这个时候如果服务器配置够的话&#xff0c;可以尝试在服务器上装一下。但是服务器一般都是linux系统的&#xff0c;于是这篇教程就出现了… 可行性分析 通读安装…

图书管理系统系统-Java、SpringBoot、Vue和MySQL开发的图书馆管理系统

「springboot、vue图书馆管理系统.zip」 链接&#xff1a;https://pan.quark.cn/s/5a929a7e9450 分享一个图书管理系统&#xff0c;Java、SpringBoot、Vue和MySQL开发的图书馆管理系统 以下是对文本内容的总结&#xff1a; 项目概述 项目名称与背景&#xff1a; 项目概述 项…

[c语言日寄]数据输入

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

字节DAPO算法:改进DeepSeek的GRPO算法-解锁大规模LLM强化学习的新篇章(代码实现)

DAPO算法&#xff1a;解锁大规模LLM强化学习的新篇章 近年来&#xff0c;大规模语言模型&#xff08;LLM&#xff09;在推理任务上的表现令人瞩目&#xff0c;尤其是在数学竞赛&#xff08;如AIME&#xff09;和编程任务中&#xff0c;强化学习&#xff08;RL&#xff09;成为…

计算机操作系统(四) 操作系统的结构与系统调用

计算机操作系统&#xff08;四&#xff09; 操作系统的结构与系统调用 前言一、操作系统的结构1.1 简单结构1.2 模块化结构1.3 分层化结构1.4 微内核结构1.5 外核结构 二、系统调用1.1 系统调用的基本概念1.2 系统调用的类型 总结&#xff08;核心概念速记&#xff09;&#xf…