内存管理、内存分配malloc、free、realloc,printf小结

C语言从零到精通:指针、内存与系统编程实战指南 编程语言是人与计算机沟通的桥梁,而C语言作为一门贴近硬件的系统级语言,其核心价值在于让开发者深入理解计算机底层工作原理。从变量、数据类型到函数、控制流,C语言通过直接操作内存和地址,揭示了程序在机器中运行的实质。掌握指针这一核心概念,不仅能理解数据在内存中的组织与访问方式,更是学习动态内存管理、数据结构构建乃至操作系统内核的基础。这种对内存布局和生命周期的精细控制能力,是开发高性能系统软件、嵌入式固件以及理解现代高级语言运行时机制的关键。本文围绕C语言学习中的核心难点——指针与内存管理,结合数组、结构体等复 阅读详情

      现在将一些内存管理相关的知识总结一下,以便对之前的知识进行归纳,也让自己清楚薄弱环节,以及提醒自己许多东西还是要做好准备!

    内存管理,片内碎片,片外碎片


内存分配机制malloc,realloc


内存释放机制free


指针的存放,堆区、栈区、数据区、代码区


变量的定义与初值

首先要了解内存中的存储空间,内存中用户区的存储空间主要分为程序区、静态存储区、动态存储区。

数据分别存放在静态存储区和动态存储区。静态存储区,主要存放全局变量和静态的局部变量。

动态存储区存放的数据为:

1 函数形式参数,在调用函数时给形参分配存储空间。

2自动变量(未加static声明的局部变量)

3函数调用时的现场保护和返回地址等。

对以上描述的动态存储区的数据,在函数调用开始时分配动态存储空间,函数结束时释放这些空间。在程序的执行过程中,这种分配和释放是动态的,如果在一个程序中两次调用同一函数,分配给此函数中的局部变量的存储空间地址可能是不相同的。

在C语言中,每个变量和函数有两个属性:数据类型和数据的存储类别。数据的类型这里不重点关注,重点关注数据的存储类别。数据的存储类别指的是数据在内存中存储的形式。存储类型具体包含四种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。根据变量的存储类别可以知道变量的存储域和生存期。

1 auto变量

函数中的局部变量,如果不专门声明为static存储类别,都是动态的分配存储空间的,数据存储在动态存储区中。auto可以省略。

2 static变量

用static声明的静态局部变量,在函数调用结束后不消失而是保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数结束时的值。编译时自动赋初值0。

虽然静态局部变量在函数调用结束后仍然存在,但是其他函数不能引用它。

3 register变量

一般情况下,变量的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到运算器中。

如果有一些变量使用频繁,则为存取变量的值要花费不少时间。为了提高效率,c语言允许将局部变量的值存放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。

4 extern变量

外部变量是函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中的各个函数所引用。编译时将外部变量存放在静态存储区,有时候需要将函数声明为外部变量来扩展外部变量的作用域。

比如在程序文件的中间定义的函数只能让其后定义的函数使用,而如果上面的函数调用则需要使用extern关键字声明,以扩展作用域到整个文件。

另外如果在一个程序文件中定义的变量如果想在另外的文件中使用,在需要在定义文件中定义,在引用文件中使用extern关键字声明。


从以上分析可以看出————
把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

因此static这个说明符在不同的地方所起的作用是不同的。应予以注意。



栈与进制转换:顺序栈和链栈实现十进制转二/八/十六进制 栈是数据结构中最基础也最实用的线性结构之一,其“后进先出”(LIFO)特性为很多逆序处理问题提供了天然解法。进制转换中的“除基取余”算法会依次产生从低位到高位的余数,而输出结果却需要从高位到低位,这种顺序反转恰好与栈的弹出顺序完美契合。顺序栈基于数组实现,访问高效、容量固定,适合元素个数可预估的场景;链栈利用链表头插法实现,支持动态分配内存,适合元素数量不确定的工程环境。在C语言工程实践中,通过接口解耦、边界条件处理(零、负数、非法进制)以及动态扩容扩展,可以将课程作业级的代码提升为可上线的通用工具。该技术 阅读详情

相关推荐

保姆级避坑指南:Mid-360雷达到手后,用livox_ros_driver2从接线到出点云的完整流程

本文提供Mid-360雷达到手后的完整使用指南,涵盖从硬件接线、网络配置到livox_ros_driver2驱动的安装与调试,帮助用户避开常见陷阱,实现点云数据的稳定输出与可视化。重点解析了配置文件的参数设置和点云格式选择,确保用户能够高效部署和使用Mid-360雷达。

weixin_30733003的博客 486

AFL源码浅析

前言AFL是一款著名的模糊测试的工具,最近在阅读AFL源码,记录一下,方便以后查阅。环境•项目:AFL•编译项目:将编译的优化选项关闭,即改写成-O01afl-gcc.c使用gdb加载afl-gcc,并使用set arg -o test test.c设置参数2find_as函数•find_as函数首先会通过AFL_PATH环境变量的值从而获得AFL对应的路径•若上述环境变量不存在则获取当前...

蚁景网安学院 1372

3DE重客户端安装

3DE重客户端安装

m0_48170265的博客 9429

单片机上内存管理(重定义malloc & free)de实现

   在单片机上经常会需要用到像标准c库中的内存分配,可是单片机并没有内存管理机制,如果直接调用库函数(malloc,free...),会导致内存碎片越用越多,很容易使系统崩溃掉,这里分享一个自己写的适用于单片机的内存分配方法,具备轻量级的内存管理能力,有效减少内存碎片,提高单片机系统工作稳定性。    如下图,heap_start开始的地方,是我们存放用户数据的地方,在heap_end之前都是...

泡在妞里的Feel 5498

基于FPGA的函数信号发生器设计

设计采用波形查找表和相位累加器的方法实现DDS,查找表的数据位宽为8位,采样点数为4096。波形产生范围是100Hz-20MHz,最小频率间隔为1Hz,用8个数码管显示频率,可产生正弦波、方波、三角波,波形用两个led显示,select信号控制,全灭为正弦波,一亮一灭为方波,全亮为锯齿波。为了使频率和相位便于调节,用3个拨码开关控制步进,用8个led显示状态。

FPGA入门到跑路 5636

激光条纹中心提取——Steger

激光条纹中心提取-Steger 好久没有记录了,记录一下今天学习的内容,据说Steger在激光条纹中心提取上神一般的存在。文章和代码都分享给大家了哈,其中有四个文件,3个C++,一个python,python一个抠图文件,3个c++包含背景图+原图, 单张图提取, 多张图提取。 分享代码 #include <opencv2\core.hpp> #include <opencv2\highgui.hpp> #include <opencv2\imgproc.hpp> #i

CharmsLUO的博客 5381

AFL源码分析之afl-fuzz(学习笔记)(二)

前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、源码 1.setup_shm(配置共享内存和virgin_bits) /* Configure shared memory and virgin_bits. This is called at startup. */ /*配置共享内存和原始字节。这叫做启动*/ EXP_ST void

github_53542847的博客 1530

FastAdmin框架Token验证实战:从登录到API调用的完整流程

本文详细解析了在FastAdmin框架中实现Token验证的完整流程,从数据表设计、登录接口签发Token,到核心验证中间件的编写与路由配置,并探讨了在业务API中的调用与安全实践。内容涵盖Token生成策略、有效期管理及安全增强措施,为开发者提供了一套可落地的API身份验证解决方案。

nnn11的博客 917

动态内存分配

动态内存是相对静态内存而言的。所谓动态和静态就是指内存的分配方式。动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存。前面所写的程序大多数都是在栈上分配的,比如局部变量、形参、函数调用等。栈上分配的内存是由系统分配和释放的,空间有限,在复合语句或函数运行结束后就会被系统自动释放。而堆上分配的内存是由程序员通过编程自己手动分配和释放的,空间很大,存储自由。堆和栈后面还会专门讲,这里先了解一下。 传统数组的缺点 “传统数组”就是前面所使用的数组,与动态内存分配相比,传统数组主要有以下几个缺点:.

qq_61514490的博客 1252

【35】软考软件设计师——设计模式代码填空(C++版)满分精讲|第5/6题二选一必考

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第35篇,聚焦下午选做题**第5/6题C++版设计模式代码填空**,与上一篇Java版形成双子配套,单题分值稳定12~15分。全文超4000字深度拆解C++独有核心考点:虚函数/纯虚函数、构造与析构函数规范、继承权限、模板类编程在设计模式中的应用;精讲单例、工厂、策略、观察者、适配器五大高频模式的C++专属代码写法,标注所有填空核心点位、语法陷阱、内存安全规范

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 543

什么是 Agent 的 Context Window?为什么它是 Agent 工程中最核心的约束之一?

什么是 Agent 的 Context Window?为什么它是 Agent 工程中最核心的约束之一?

我哎GIS博客 818

c语言中内存分配方式

c语言内存分配方式有下面三种: 1.从静态存储区域分配 由编译器自动分配和释放,在程序编译的时候就已经分配好内存,这块内存在程序的整个运行期间都存在,直到整个程序运行结束时才被释放,如全局变量与static变量。 2.在栈上分配 同样由编译器自动分配和释放,在函数执行时,函数内部的局部变量都可以在栈上创建,函数执行结束时,这些存储单元将被自动释放 (需要注意的是,栈内存分配运算内置于处理...

u010547141的博客 3860

2. Android_逆向的历史与发展

学完本节,希望你能够:了解 Android 逆向工程的发展历程,从早期 APK 破解到现代应用保护;入门先把这几类「在干啥」搞清楚,后面学脱壳、反反调试会顺很多。(反编译 APK 得到的类汇编代码,相当于程序的「菜谱」)就能绕过验证,到后来混淆、加固、反调试一起上,逆向难度越来越高。(第三节 什么是 CPU 指令集),帮你搞清楚「反汇编看到的那些指令」是从哪来的、和 Android 逆向有啥关系。有必要——先搞清「没加固时怎么玩」,再学脱壳和对抗,思路才顺。读起来费劲,但逻辑还在,耐心一点还能跟。

长沙火山 1390

19. 【C语言】动态内存分配

动态内存分配:它强大,但也危险,申请了要记得还,还了就别再用。今天我们就来掌握这套“手动内存管理”的艺术。

gugucoding的博客 484

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C语言学习路径:从环境搭建到项目实战,一个月掌握核心编程

编程语言是计算机科学的基础,其核心在于理解数据如何被处理、存储和操作。C语言作为一门接近硬件的编译型语言,其设计原理直接映射计算机的内存和CPU操作,这使得它成为理解计算机系统底层运作机制的理想选择。从技术价值看,掌握C语言不仅能编写高效、紧凑的代码,更能为学习操作系统、编译原理等高级主题打下坚实基础,这种底层认知能力是驾驭Python、Java等高级语言性能调优的关键。在应用场景上,C语言广泛用于系统软件(如Linux内核)、嵌入式开发、游戏引擎和高性能计算库的开发。本文聚焦于C语言学习,通过系统讲解环境

weixin_30727835的博客 297

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

rtthread 函数学习

rt_system_heap_init 在使用堆内存前,必须要在系统初始化的时候进行堆内存的初始化,函数为 void rt_system_heap_init(void *begin_addr,void *end_addr) 注:这个函数会把begin_addr和end_addr作为堆空间来用。 参数 描述 begin_addr 堆内存的起始地址 end_addr 堆内存的结束地址 从内存堆中申请用户指定大小的内存块 rt_malloc void* rt_malloc(rt_size_...

c1063891514的博客 1556

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

零基础高效学习C语言:从核心语法到实战项目的系统路径

编程语言是计算机科学的基础,它定义了人与机器沟通的规则。C语言作为一门贴近硬件、效率至上的编译型语言,其核心原理在于通过简洁的语法和直接的内存操作,实现对计算机资源的精细控制。掌握C语言不仅能培养严谨的计算思维和内存思维,更是深入理解操作系统、数据结构及嵌入式系统等底层技术的基石,具有极高的技术价值。在工程实践中,C语言广泛应用于系统软件、嵌入式开发和高性能计算等场景。本文聚焦于C语言学习路径,通过构建系统性的知识图谱和循序渐进的实战项目,帮助初学者高效建立编程思维,并特别针对指针与内存管理这一核心难点进行

weixin_30907935的博客 411

C语言从入门到进阶(个人笔记细节版)鲍松山老师课程

《C语言入门基础笔记》摘要 本文是C语言基础入门教程,包含以下核心内容: 开发环境:推荐VS2026/Dev-C++/CodeBlocks编译器 基础语法:首个C程序结构、数据类型(整型/浮点型)及存储大小 输入输出:printf/scanf函数详解,格式化输出技巧 进制转换:二进制/八进制/十进制/十六进制互转方法 变量常量:定义、命名规则、作用域及const与#define区别 实用技巧:VS编译器问题解决方案、格式化输出控制、浮点精度处理 配套练习:包含日期反向输出、进制转换等实践题目 笔记采用渐进式

一起学习编程知识 583

基于Freertos Heap4的Realloc的编写

由于发现FreeRTOS(v9.0.0)中并没有对realloc进行支持,所以就自己写了pvPortRealloc函数。 首先先谈谈Heap4内存管理机制,由xStart为头结点,pxEnd为尾节点构成的一条链表。用来描述ucheap数组中尚未分配的地址块。这些地址块按照地址从小到大插入到链表中。 当使用pvPortMalloc 申请N个字节数据时,首先会...

qq_39150545的博客 4313

freertos学习

在malloc时会寻找空闲内存块中满足申请大小的最小内存块,并将多余的那部分再分割出来作为新的空闲块,并且不会合并相邻空闲块。比如现在有5字节、25字节、50字节三个空闲块,申请20字节大小时,会自动匹配25字节的空闲块,并将多余的5字节分割出来,作为新的空闲块等待分配。:又创建一个task,如果这个task的stack和之前删除的task一样,那么这个task就会使用删除掉的task使用的空间。heap顶部仍然是一大块空闲空间,同时删除的task之前所占的TCB、Stack空间也变为空闲。

qq_45669254的博客 205

malloc、free、printf、scanf函数原型

malloc和free这两个和内存相关的函数都在头文件stdlib.h中,所以在应用的时候,需要包含该文件: #include 1、malloc void* malloc(size_t size); malloc向系统申请分配制定size个字节的内存空间。返回类型是void*类型。在C或者C++中,void*类型可以强制转换为任何其他类型的指针。 2、free void fre

前端产品工程师 3309

gdb调试一个递归问题(malloc、printf)

从此现象得出一个结论,程序第一次调用printf,printf内部会调用malloc(1024)申请一个缓冲区。学习链接:https://github.com/0voice。

GHL284271090的博客 340

C/C++的printf会调用malloc()

排查内存问题(或相关的疑难杂症)时,可能一句printf就能让bug出现,或者赶走bug。你可能觉得很神奇,但这并不神奇。至少我们可以在 Linux-x64 下,通过 malloc hook,来验证当前的编译环境下, printf 确实是调用了 malloc。而 malloc 底层也不是吃素的, 默认是 glibc 的 ptmalloc 这个内存管理器, 如果本身你的程序把内存控制块写坏了, 继续 malloc 那就容易出现问题, 也就表现为 printf 影响了 bug 的出现。来看代码。

baiyu33的博客 511

【AFL(七)】afl-fuzz.c小改——输出文件夹暂存

前言: 之前已经写过两篇针对tmin、cmin的修改,现在再改afl-fuzz.c已经轻车熟路了,对整个afl的源码结构也比较了解了。 afl-tmin:https://www.cnblogs.com/wayne-tao/p/11964565.html afl-cmin:https://www.cnblogs.com/wayne-tao/p/11971922.html 此番修改是因为,对...

未配妥剑 已入江湖 508

20 printf 的调试

在最开始的 cmd 编程中, 我们会使用到的最常见的输出, 包括一些时候调试的时候 我们最常使用到的函数 那肯定是 printf 了我们这里来调试一下 这个 printf还有一个原因是 之前在调试 malloc 的时候,可以发现, 不仅仅是在 malloc 的时候调用了 malloc, 在 printf 的时候也调用了 malloc然后 我们这里来看一下 具体的情况, 以及一些 抽象的理解映射到 代码上面怎么处理的也可以参考一下。

970655147的专栏 1061
上一篇: 重拾C语言基础知识
下一篇: SD卡以及nand flash相关知识整理
野-百-合
博客等级 码龄17年 308粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值