C语言——动态内存函数(malloc、calloc、realloc、free)
了解动态内存函数
- 前言:
- 一、malloc函数
- 二、calloc函数
- 三、realloc函数
- 四、free函数
前言:
在C语言中,动态内存函数是块重要的知识点。以往,我们开辟空间都是固定得,数组编译结束后就不能继续给它开辟空间了,开辟的空间满了,就不能在开辟空间了(就是不能在添加数据了)。学习本文章,我们就可以解决这个问题,向内存申请空间,满啦可以继续申请空间。
一、malloc函数
需要头文件——<stdlib.h>

浏览器直接翻译:

malloc函数(动态内存开辟的函数):
void* malloc(size_t size);
功能:
这个函数向内存申请一个连续可用的空间,并返回指向这块空间的指针。
- 如果开辟成功,则返回一个指向开辟好空间的指针。
- 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
- 返回值的类型是void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候由使用者自己决定。
- 如果size为0,malloc的行为是标准还是未定义的,由编译器决定。
- malloc申请的空间,当程序退出时,要还给操作系统,当程序不退出,动态申请的内存,不会主动释放,需要用free函数来释放。
malloc申请的内存空间:
malloc申请到空间后,直接返回这个空间的首地址,不会初始化空间的内容。
举个例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//变长数组的知识点(vs不能用,gcc可以用)//int num = 0;//scanf("%d", &num);//int arr[num] = { 0 };int* ptr = NULL;ptr = (int*)malloc(40);if (ptr == NULL)//判断ptr指针是否为空{perror("malloc");exit; }else{int i = 0;for (i = 0; i < 10; i++)//给开辟的空间赋值ptr[i] = i + 1;}free(ptr);//释放ptr指向的空间ptr = NULL;//让ptr指向空return 0;
}
二、calloc函数
需要头文件——<stdlib.h>

浏览器直接翻译:

calloc函数(动态内存分配函数):
void* calloc(size_t num, size_t size);
功能:
- 函数的功能是,为num个大小为size元素开辟一块空间,并且把空间的每一个字节初始化为0.
- 与malloc函数的区别,只在于calloc函数会在返回地址之前把申请空间的每一个字节初始化为0.
举个例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{int* p = (int*)calloc( 10,sizeof(int));if (p == NULL)//成立,开辟失败{perror("calloc");exit;}free(p);p = NULL;return 0;
}
p指向的地址:

三、realloc函数
需要头文件——<stdlib.h>

浏览器直接翻译:

realloc函数(动态内存管理更加灵活):
有时候我们发现过去申请的空间小了,有时候我们会觉得过去申请的空间过大,为了合理使用内存,我们一定要对内存的大小做灵活的调整。realloc函数可以做到对动态开辟内存大小进行调整。
void* realloc(void* ptr, size_t size);
功能:
- ptr是要调整的内存地址。
- size是调整后的新大小。
- 返回值为调整之后的内存起始位置。
- 这个函数在调整原空间大小的基础上,还会将原来的数据移到新的空间。
注意:
realloc调整内存空间有两种情况。-
情况1:原有空间之后有足够大的空间(原地扩容)。
当是情况1的时候,要扩展内存就直接在原有内存之后直接追加空间,原来空间的数据不发生改变。

-
情况2:原有空间后面没有足够大的空间(异地扩容)。
当是情况2的时候,原有空间后面没有足够多的空间时,扩展的方法是:在堆空间上另外找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址。

所以我们在使用realloc函数的时候一定要注意:
1、开辟新的空间。
2、 会将旧的空间数据拷贝到新的空间。
3、释放旧的空间。
4、返回新空间的起始地址。
举个例子:
-
#include <stdio.h>
#include <stdlib.h>
int main()
{int* ptr =(int*) malloc( 100 );if (ptr != NULL){
//可以使用这个空间}else{perror("malloc");exit;}//扩展空间int* p = (int*)realloc(ptr, 1000);//可能增容失败if (p != NULL){//增容成功ptr = p;//p指向的空间交给ptr去维护}free(ptr);//把开辟早堆上的空间释放掉ptr = NULL;return 0;
}
四、free函数
需要头文件——<stdlib.h>

浏览器直接翻译:

free函数(释放动态开辟的内存):
void* free(void* ptr);
功能:
- 如果参数ptr指向的那个空间不是动态开辟的,那free函数的行为是未定义的。
- 如果参数ptr是NULL指针,则函数什么事都不做。
相关文章:
C语言——动态内存函数(malloc、calloc、realloc、free)
了解动态内存函数 前言:一、malloc函数二、calloc函数三、realloc函数四、free函数 前言: 在C语言中,动态内存函数是块重要的知识点。以往,我们开辟空间都是固定得,数组编译结束后就不能继续给它开辟空间了࿰…...
Redis数据结构——Redis简单动态字符串SDS
定义 众所周知,Redis是由C语言写的。 对于字符串类型的数据存储,Redis并没有直接使用C语言中的字符串。 而是自己构建了一个结构体,叫做“简单动态字符串”,简称SDS,比C语言中的字符串更加灵活。 SDS的结构体是这样的…...
【计算机网络】TCP协议超详细讲解
文章目录 1. TCP简介2. TCP和UDP的区别3. TCP的报文格式4. 确认应答机制5. 超时重传6. 三次握手7. 为什么两次握手不行?8. 四次挥手9. 滑动窗口10. 流量控制11. 拥塞控制12. 延时应答13. 捎带应答14. 面向字节流15. TCP的连接异常处理 1. TCP简介 TCP协议广泛应用于可靠性要求…...
Salesforce特别元数据部署技巧
标准的picklist字段部署 <?xml version"1.0" encoding"UTF-8" standalone"yes"?> <Package xmlns"http://soap.sforce.com/2006/04/metadata"><types><members>Opportunity.StageName</members><…...
[前端系列第2弹]CSS入门教程:从零开始学习Web页面的样式和布局
在这篇文章中,我将介绍CSS的基本概念、语法、选择器、属性和值,以及如何使用它们来定义Web页面的外观和布局。还将给一些简单而实用的例子,可以跟着我一步一步地编写自己的CSS样式表。 目录 一、什么是CSS 二、CSS的语法 三、CSS的选择器 …...
非计算机科班如何丝滑转码?
转码,也就转行为程序员,已成为当今数字化时代的一种重要技能。随着科技的发展,越来越多的人开始意识到掌握编程技能的重要性,而非计算机科班出身的朋友们,想要丝滑转码,也许可以从以下几个方面入手。 一、明…...
亿发创新中医药信息化解决方案,自动化煎煮+调剂,打造智能中药房
传统中医药行业逐步复兴,同时互联网科技和人工智能等信息科技助力中医药行业逐步实现数字化转型。利用互联网、物联网、大数据等科技,实现现代科学与传统中医药的结合,提供智能配方颗粒调配系统、中药自动化调剂系统、中药煎配智能管理系统、…...
Vulnhub: MoneyBox: 1靶机
kali:192.168.111.111 靶机:192.168.111.194 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.194 ftp匿名登录发现trytofind.jpg 目录爆破发现blogs目录 gobuster dir -u http://192.168.111.194 -w /usr/share/word…...
[国产MCU]-BL602开发实例-LCD1602 I2C驱动
LCD1602 I2C驱动 文章目录 LCD1602 I2C驱动1、LCD1602/LCD2004介绍2、硬件准备3、驱动实现本文将详细介绍如何在K210中驱动LCD1602/LCD2004 I2C显示屏。 1、LCD1602/LCD2004介绍 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱…...
AI 绘画Stable Diffusion 研究(七) 一文读懂 Stable Diffusion 工作原理
大家好,我是风雨无阻。 本文适合人群: 想要了解AI绘图基本原理的朋友。 对Stable Diffusion AI绘图感兴趣的朋友。 本期内容: Stable Diffusion 能做什么 什么是扩散模型 扩散模型实现原理 Stable Diffusion 潜扩散模型 Stable Diffu…...
URLSearchParams:JavaScript中的URL查询参数处理工具
文章目录 导言:一、URLSearchParams的来历二、URLSearchParams的作用三、URLSearchParams的方法和属性四、使用示例五、注意事项六、结论参考资料 导言: 在Web开发中,处理URL查询参数是一项常见的任务。为了简化这一过程,JavaScr…...
1.4 数据库管理与优化
数据库管理与优化 文章目录 数据库管理与优化1. 数据库概述1.1 数据库的定义和作用1.2 数据库管理系统(DBMS) 2. 数据库模型2.1 关系型数据库**2.2 非关系型数据库 3. 数据库设计3.1 数据库设计原则3.2 数据库设计步骤 4. 数据库优化4.1 数据库性能优化4…...
T113-S3 Tina-Linux -- 2.开发板使用
1. 硬件环境 1.1 开发板 型号:100ASK_T113-PRO Base V1.1(韦东山)配置:CPU:T113-S3,RAM:128MB,ROM:128MB 2. 各模块使用 2.1 wifi wifi模组型号:XR829…...
Django-配置邮箱功能(一):使用django自带的发送邮件功能
一、获取邮箱授权码 以QQ邮箱为例子: 1、进入到设置,找到账户 2、开启POP3等服务,点击管理服务 3、进入管理服务,生成授权码 4、按照要求发送短信就可以了 5、将授权码复制保存,离开界面就看不到了 二、django项目中…...
JS实现树形结构、一维数组以及map之间的转换
const treeData[ {id:1, name:中国, children:[ {id:11,name:河南省,children:[{id:111,name:南阳市,children:[{id:1111,name:淅川县,children:null}]},{id:112,name:郑州市,children:[{id:1121,name:中牟县,children:null}]}] }, {id:22,name:广东省,children:[{id:221,name:…...
Vue中自定义.js变量
1、定义.js文件 order.js文件内容: // 订单是否报账 const EXPENESS_STATUS_NO0; const EXPENESS_STATUS_YES1; // 状态 0-未发货 1-发货 2-确认收获 const STATUS_NO0; const STATUS_SEND1; const STATUS_DELIVERY2; // 如何不加这个,vue中引…...
基于深度信念神经网络+长短期神经网络的降雨量预测,基于dbn-lstm的降雨量预测,dbn原理,lstm原理
目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) LSTM原理 DBN-LSTM的降雨量预测 基本结构 主要参数 数据 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,通过dbn进行无监督学习提取特征,然后长短期神经…...
SyntaxError: Cannot use import statement outside a module
node环境运行报错: 解决步骤: 1. npm init -y 2. 在 package.json 文件中加入一条:"type": "module", 3. 保存后再执行即可 附:最好是不要在node用import,否则需要上次配置 建议1:用re…...
为什么要做数据可视化系统
数据可视化系统在当今数字时代发挥着重要的作用,成为许多组织和企业的不可或缺的工具。随着信息爆炸式增长和数据处理的需求不断增加,数据可视化系统帮助人们更好地理解和分析数据,为决策提供重要支持。数聚股份将详细介绍为什么要做数据可视…...
Java项目作业~ 通过html+Servlet+MyBatis,完成站点信息的添加功能
需求: 通过htmlServletMyBatis,完成站点信息的添加功能。 以下是站点表的建表语句: CREATE TABLE websites (id int(11) NOT NULL AUTO_INCREMENT,name char(20) NOT NULL DEFAULT COMMENT 站点名称,url varchar(255) NOT NULL DEFAULT ,…...
Qwen3.5推理模型效果实测:分步骤解题、结构化分析惊艳展示
Qwen3.5推理模型效果实测:分步骤解题、结构化分析惊艳展示 1. 模型核心能力概览 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF作为一款专精推理的蒸馏模型,在结构化问题解决方面展现出独特优势。经过实测,其核心能力可归纳为三个维…...
解决Open-AutoGLM部署难题:ADB连接、模型加载、内存不足全攻略
解决Open-AutoGLM部署难题:ADB连接、模型加载、内存不足全攻略 1. 项目简介与核心价值 Open-AutoGLM是智谱AI开源的手机端智能助理框架,它能通过自然语言指令自动操控安卓设备。想象一下,只需说"打开小红书搜美食",AI…...
PyCharm与Anaconda环境管理详解:Phi-3-mini-4k-instruct-gguf解决Python包冲突
PyCharm与Anaconda环境管理详解:Phi-3-mini-4k-instruct-gguf解决Python包冲突 1. 为什么需要环境管理工具 Python开发中最让人头疼的问题之一就是包冲突。你可能遇到过这种情况:昨天还能运行的代码,今天突然报错;或者在一个项目…...
深度行业洞察:如何科学评估与挑选高品质宠物智能舱?
随着“人宠共居”生活方式的深入,宠物智能家电市场迎来了前所未有的井喷。然而,面对市面上价格悬殊、功能各异的智能设备,许多初次接触智能养宠的消费者往往无从下手。因此,建立一套科学的新手养猫指南:客观评估智能猫…...
【Overview Effect】 -在抵达月球之前,让我们最后一次眺望地球
“当我们前往月球时,我们专注于探索月球,但实际上我们发现的是地球。” —— 这种视角让人们意识到,地球不仅是家园,更是一艘在寒冷宇宙中孤立无援的“救生船”。在抵达月球之前,让我们最后一次眺望地球。这张地球照片…...
CVPR2025新思路:把对抗扰动本身当成‘训练数据’,聊聊PSP-UAP背后的设计哲学
CVPR2025新思路:对抗扰动作为训练数据的革命性设计哲学 对抗样本研究领域正在经历一场范式转变——从单纯制造攻击工具到重新思考扰动本身的语义价值。PSP-UAP(Pseudo-Semantic Prior Universal Adversarial Perturbation)的突破性在于&#…...
2026届必备的十大降重复率工具实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 维普 AIGC 检测系统,是特意为学术机构还有研究者用心设计的,它的主要…...
PID控制算法原理与应用详解
1. PID控制算法概述PID控制算法是工业控制领域应用最广泛的控制算法之一,它通过比例(P)、积分(I)和微分(D)三个环节的组合,实现对被控对象的精确控制。这种算法结构简单、参数物理意…...
SEO_从零开始构建可持续的SEO优化体系(468 )
SEO从零开始:构建可持续的SEO优化体系 在互联网时代,搜索引擎优化(SEO)已经成为每一个网站拥有良好流量和知名度的关键。特别是在百度这样的大型搜索引擎上,一个良好的SEO优化体系不仅能提高网站的排名,还…...
C++的std--ranges等价
C的std::ranges等价:现代算法的新范式 C20引入的std::ranges库彻底改变了传统算法的编写方式,其中“等价”(equivalence)概念是理解范围操作的核心之一。与传统的“相等”(equality)不同,等价关…...
