《c和指针》笔记10--动态分配内存
因为数组存储在内存中连续的位置上,当使用一个数组在运行时才知道长度的情况下,我们就可以使用动态内存分配。
对于声明时就指定长度的数组来讲,主要有以下几个缺点:
1、需要使用的元素超过数组的长度
2、将数组声明得较大,但是某些情况下的数组元素较少时,浪费比较大
3、使用的元素超过数组长度时,程序必须以一种合理的方式做出相应,而不应该导致异常。
显然动态内存可以让我们在使用的时候不用在意元素的数量大小,我们可以在运行时,使用malloc函数来获取动态内存,如:10、20、30个int所需的内存。
但是malloc并不是每次都能将你所需要的内存返回给你,当某些极少数的情况下,malloc未申请到你所需要的内存时,将会返回NULL,因此在程序中,应该对malloc返回的指针进行检查。
对于malloc的内存块指针,我们需要手动对这块内存进行初始化,如果不想自己手动将其初始化为0的话,可以使用calloc函数,它在返回指针之前会将其初始化为0。
如果想修改原有的内存大小的话,可以使用realloc函数。以上几个函数的原型如下:
void *malloc( size_t size ); void *calloc( size_t num_elements, size_t element_size ); void realloc( void *pt, size_t new_size );
那么在使用的过程当中,首先是再次要提醒的是,对于返回的指针需要进行NULL的检查,在操作返回的内存时,也要注意不要越过边界。
因为你并不能保证,你所访问的超过边界的内存是一个空的内存,其上没有存储其他的数据,如果存在其他的数据,那么当你试图改变或转换该数据时,程序将会崩溃或者晚些时候崩溃。
因此可以是用#define定义一个不易发生错误的内存分配器。
对于使用有垃圾回收机制的语言的人可能不习惯自己去释放内存,然而在C中,如果不释放不使用的内存的话,那么将会造成内存泄露。
另外如果试图释放并非动态分配的内存、继续使用已经释放了的内存的话,也将会造成程序或系统的崩溃。
今天就到这里了,明天继续,加油!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述