C语言-动态内存分配总结

C语言动态内存分配 C语言动态内存分配 ​ 前言:要理解动态内存分配,我们首先从传统数组的缺陷开始讲起,为了弥补这些缺陷,我们提出了动态内存分配这个概念,然后间接如何用代码实现动态内存分配以及动态内存分配的原理(涉及到C语言内存方面和指针的知识),然后讲解了和静态内存分配的区别,之后还补充了一定堆栈的知识。重点内容主要在第3点里面的代码部分以及图解部分 ​ 1.传统数组的缺点 ​ (1)数组长度必须事先制定,且只能是... 阅读详情

1 malloc

void *malloc( unsigned int num_bytes) 

分配长度为num_bytes个字节的内存块,返回值为无类型指针,该指针指向所分配内存块的起始位置,因此利用该无类型指针赋值给其他类型的指针的时候,需要进行强制类型转换。

int *p = (int *)malloc(sizeof(int) * 20);

当内存分配失败时,返回空指针NULL。在使用malloc 分配内存之后,进行NULL判断是一个良好的编程习惯。

2 calloc

void *calloc( unsigned int num, unsigned int size)

在内存的动态存储区分配num个长度为size的存储块,返回指向该存储块起始地址的无类型指针,若返回失败,返回NULL。因此,同样需要对该函数返回值进行判断。

int *p = (int *)calloc(20, sizeof(int));

区别联系

  • calloc与malloc的一个相同点在于使用之后均需要free(指针),释放内存块。
  • 不同点在于calloc分配内存之后,会自动将这一块的内存之初始化为0,而malloc则不会,分配内存的值为一些垃圾数值。因此,在使用malloc函数之后,我们一般要调用函数memset对内存进行初始化。

3 memset

void *memset(void *s, int ch, unsigned int size) 

将s所指向的内存块的前size个字节全部设置为ch对应的ASCii值。 它是对较大数组或者结构体清零操作的最快方式。

memset(p, 0, 80);

4 realloc

void *realloc (void *p, unsigned int size);

如果已经通过malloc或者calloc获得了动态空间,想改变其大小,可以使用realloc函数重新分配,将p所指的动态空间大小改变为size,而p的值不变,如果重新分配不成功,返回NULL。原来空间的内容会保留。

C语言(动态内存分配) void* calloc(size_t nitems,size_t size) 分配所需的内存空间,并返回。函数功能:尝试重新调整之前调用malloc或calloc所分配的ptr所指向的内存块的大小。形式参数:size_t size:需要申请的内存块的大小,以字节为单位。返回值类型:void*(万能指针):该函数返回一个指针,指向已分配大小的内存,如果请。返回值类型:void*:该函数返回一个指针,指向已分配大小的内存,如果请求失败,返回。:该函数返回一个指针,指向已分配大小的内存。 阅读详情

相关推荐

C语言动态内存分配的详解

C语言动态内存分配的详解 1.为什么使用动态内存分配 数组在使用的时候可能造成内存浪费,使用动态内存分配可以解决这个问题。 2. malloc和free C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放。 (1)void *malloc(size_t size); malloc的参数就是需要分配的内存字节数。malloc分配一块连续的内存。如果操作系统无法向malloc提供更多的内存,malloc就返回一个NULL指针。 (2)void free(void *pointer); free的参数要么是NULL,要么是一个先前从malloc、calloc或reall

[C语言]动态内存分配详解

这些函数都是在堆区存放的,使用时需要stdlib.h这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。free函数用来释放动态开辟的内存。

m0_74978334的博客 1979

C语言 动态内存分配的详解及实例

主要介绍了C语言 动态内存分配的详解及实例的相关资料,需要的朋友可以参考下

usb hub和usb device注册过程

A10的cpu有一个hub,也就是root hub,下边带有三个controller。其中第0个控制器具有otg功能,它的端点0支持最大64字节的控制传送,另外具有5个端点;控制器1、2只能作为host用,其下面最多能外接一个hub。如果控制器0作为device用,简称udc;如果作为host用,就和其他两个控制器一样简称hcd。      他们作为平台设备注册进内核,平台资源在drivers/

xiaofengcanyue2013的专栏 4000

工业质检实战:用海康VisionMaster的BLOB分析搞定PCB焊点缺陷检测

本文详细介绍了如何利用海康VisionMaster平台的BLOB分析技术,构建一套针对PCB焊点缺陷的自动化视觉检测方案。文章从核心原理出发,重点阐述了如何通过动态阈值分割和模板匹配定位,克服工业现场光照不均、位置偏移等挑战,实现虚焊、漏焊等缺陷的精准、稳定检测,并提供了实战调优与系统集成的关键思路。

weixin_29091105的博客 560

STM32H743实战(三)-- 时钟系统配置

本文详细讲解了STM32H743时钟系统的配置方法,重点解析了为何选择400MHz而非理论极限480MHz作为稳定运行的主频。通过STM32CubeIDE环境,手把手指导如何从外部晶振配置、电源电压设置到PLL锁相环参数调整,最终实现稳定可靠的400MHz系统时钟,并提供了代码验证与常见问题排查指南。

weixin_29164185的博客 368

xdma 驱动分析

xlx_wait_event_interruptible_timeout 等待中断唤醒。初始化DMA请求 xdma_init_request(sgt, ep_addr);处理描述符使用情况达到或超过引擎最大描述符数量的情况。

小伟的博客 2469

W25N01GV SPI NAND Flash驱动开发避坑指南:详解2KB缓冲区机制与状态寄存器正确用法

本文深入解析W25N01GV SPI NAND Flash芯片的2KB缓冲区机制与状态寄存器正确用法,提供STM32 HAL和ESP-IDF项目的实战解决方案。涵盖双阶段操作原理、状态寄存器深度解析、时序控制优化及跨平台驱动设计要点,帮助开发者避免常见错误并提升存储性能。

aizhouqian5537的博客 640

Linux: USB Gadget 驱动简介

Linux, USB Gadget

JiMoKuangXiangQu的专栏 1万+

RDMA性能调优实战:如何用ib_*命令榨干你的Mellanox网卡带宽?

本文深入探讨了如何利用ib_*命令工具集对RDMA网络进行深度性能调优,以充分释放Mellanox网卡的带宽潜力。文章从理解Send/Write/Read三种核心通信原语的差异入手,逐步指导读者通过调整消息大小、队列深度、内联数据等关键参数,并结合系统级的NUMA绑定、中断亲和性等优化策略,实现从基准测试到逼近硬件极限的性能提升。

weixin_29306011的博客 88

[pytorch]FixMatch代码详解(超详细)

FixMatch代码详解-训练过程参数数据产生构建模型训练参数设置weight decay(权值衰减)学习率衰减(learning rate decay)指数移动平均(EMA)model训练过程运行结果 上一篇大概讲了数据加载的过程,这一篇更进一步,分析一下训练是怎样进行的 上一篇链接: [pytorch]FixMatch代码详解-数据加载 参数 所有的参数我都默认使用作者给出的例子: python train.py --dataset cifar10 --num-labeled 4000 --arch w

qq_38736504的博客 1万+

C语言进阶——动态内存管理

本文系统介绍了C语言动态内存分配的核心概念与实现方法。主要内容包括:1.动态内存分配原理,通过malloc、calloc、realloc和free等函数实现运行时内存管理;2.详细解析各内存分配函数的使用方法及注意事项,包括参数设置、返回值处理和内存释放规范;3.列举动态内存常见错误类型,如空指针解引用、越界访问、重复释放等;4.介绍C99标准引入的柔性数组特性,分析其内存管理优势和访问效率。

Ra337620的博客 1107

《唤醒你的AI同事:WorkBuddy从零上手》000:介绍及目录

《唤醒你的AI同事:WorkBuddy从零上手》全书导览与总目录:000–043 共 44 篇,覆盖从环境搭建、对话基础到资料库、行业助手与多模态生成的入门实战。含完整篇目速查与编号直达,建议关注收藏。

LuckyHanMo的博客 587

C语言 - 动态内存分配

malloc calloc relloc free 动态申请内存

good good study, day day up! 6046

YOLOv11【第三章:高阶应用与落地篇·第7节】多任务联合训练(Multi-Task Learning):检测+分割+关键点三头并进!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 727

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【C语言进阶篇】动态内存分配和数组的动态内存分配

本文主要介绍了C语言中常用的内存函数和数组的动态内存分配,并稍微提了一嘴柔性数组。动态内存分配是C语言中十分重要的一环,其中对二维数组的动态内存分配是个难点,需要多思考。

Ye_Ming_OUC的博客 3万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【C语言】动态内存分配

本篇文章会详细给大家介绍C语言中关于动态内存分配的知识,超级详细,相信你看完会有新的收获,那就来狠狠回顾100万遍把~

Become Mad的博客 2534

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C语言-动态内存分配讲解

我们在处理内存时,内存区域主要分为三块区域,分别为:栈区,堆区,静态区而我们经常使用的语句其实都是在栈区开辟空间的,如:int a;float b;char c;但是使用这样的声明,在栈区开辟空间时是有一定风险的存在风险:1.开辟出来的空间是固定的,不能进行具体字节大小的修改,所以可能浪费掉栈区的空间大小2.栈区空间开辟太大可能导致栈溢出因此,我们可以将一些东西存储在堆区中,堆区的空间是本身就存在的,我们要做的就是分配出来并利用这些空间,因此也叫做动态内存分配。

2301_80349538的博客 3939

C语言动态内存分配详解

文章目录前言一、为什么存在动态内存分配1、已掌握的内存开辟方式2、上述开辟空间方式的特点3、为什么存在动态内存分配二、动态内存函数的介绍1、malloc2、free3、calloc4、realloc三、常见的动态内存错误四、几个经典的笔试题五、柔性数组总结 前言 自从前两次博客写完以后,感觉对于我本人来说,收获很大,尤其是将学过的知识再度温习一遍,感觉基础扎实了很多,所以就养成了一个习惯,每学完一个模块,都会写一篇博客,不仅仅是写个我自己的,也是想通过这篇博客,与大家分享一些我的见解。本来周四就学完了动态内

WZRbeliever的博客 8415

c语言动态内存分配

首先我们看一下该函数的声明:这个函数就是向操作系统申请一块连续可用的空间单位是字节并返回申请空间的地址。

GOATLong的博客 1868

【c语言】动态内存分配

这个问题就像张三第一天去酒店302开了一间房,把李四要找的东西放在这了,然后告诉李四这间房现在属于我,明天可以来拿东西,但是第二天张三退房了,把302房间(内存)还给了酒店(操作系统),如果302房间被打扫了,那么李四要找的东西就不在了(返回给操作系统的内存被拿去使用了),如果侥幸302房间还没被打扫(操作系统没有用这块空间存储别的数据),那么东西还能找到(可能会打印hello word)。这里动态开辟内存后,直接对其进行释放,这时str指向的空间返回给操作系统,str就是野指针,if后的内容是非法访问。

weixin_51780775的博客 1840

C 语言动态内存分配

想象一下:你想写一个程序,让用户输入数组长度,然后存储数据。但—— 如果用户需要 1000 个元素,数组会不够用;如果只需要 5 个元素,剩下的 95 个空间就被浪费了。这时候,就像一把 “魔法钥匙”:它允许程序,用完再 “归还”,让内存利用更灵活高效。

2501_92019824的博客 1291

怎样在 C 语言中使用动态内存分配?

动态内存分配是 C 语言中一项重要的功能,它为程序提供了更大的灵活性和效率,但同时也需要谨慎使用,以避免出现内存泄漏、悬空指针和内存越界等问题。在实际编程中,应该养成良好的编程习惯,及时释放不再使用的内存,并对可能出现的错误进行适当的处理,以确保程序的正确性和稳定性。🎉相关推荐📙C 语言百万年薪修炼课程通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。🍅博客首页-关注博主🎗️带你畅游技术世界,不错过每一次成长机会!📙优快云专栏-C语言修炼📙技术社区-墨松科技。

发现生活,分享智慧,一起成长! 2088

C语言修炼秘籍之——动态内存分配

客官可是在寻找动态内存分配秘方?快快请进,且听我娓娓道来~

2301_80029060的博客 1240
上一篇: C语言-统计单词个数
下一篇: C语言-typedef与#define的区别
syzdev
博客等级 码龄9年 852粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值