当前位置: 首页 > news >正文

C语言开发动态内存的方法,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或realloc返回的值。

3. calloc和realloc

(1)void *calloc(size_t num_elements,size_t element_size);

calloc也用于内存分配。malloc和calloc之间的主要区别是后者在返回指向内存的指针之前把它初始化为0。

(2)realloc(void *ptr,size_t new_size);

realloc函数用于修改一个原先已经分配的内存块的大小。如果它用于扩大一个内存,那么这块内存原先的内容依然保留,新增加的内存添加到原先内存块的后面。如果它用于缩小一个内存块,该内存块尾部的部分内存被拿掉,剩余部分内存的原先内容依然保留。

4. 使用动态分配的内存

(1)使用示例

int *pi;

pi = malloc(25 * sizeof(int));

if(pi == NULL){

printf("out of memery\n");

exit(1);

}

(2)使用间接访问

int *pi2,i;

pi2 = pi;

for(i = 0;i < 25;i += 1)

*pi2++ = 0;

也可以使用下标。

int i;

for(i = 0;i < 25;i += 1)

*pi[i] = 0;

5. 常见的动态内存错误

常见的错误有:对NULL指针进行解引用操作、对分配的内存进行操作时越过边界、释放并非内存分配的内存、试图释放一块动态分配的内存的一部分以及一块动态内存释放之后被继续使用。

以上就是对C语言中动态内存分配的资料讲解,如有疑问请大家留言或者到本站社区讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2017-07-21

相关文章:

  • C语言中99 0,C语言中 \0 代表什么?
  • c语言数字星期几,计算任何一天是星期几的C语言源代码.
  • 图片c语言是输出矩阵吗,蛇形矩阵输出是要怎么写代码,感觉没有眉目啊,大佬能说一下思想吗...
  • ubuntu nfs linux,Ubuntu 14.04下NFS安装配置
  • i686-pc linux gnu,交叉编译: --host --build --target到底什么意思?
  • android 字母好友,如何获取android手机联系人并按字母展示(二)
  • sony 播放器 android,Hi-Res Audio Player
  • adb更新android分区,Android adb升级OTA
  • android 反射执行方法,Android中怎么通过反射调用setUsbTethering()方法
  • iphone没有android安全,Android安全性与iPhone一样吗
  • android listview checkbox 选中状态,Android ListView专题之十  checkbox选中的值在翻屏时会跳来跳去...
  • 鸿蒙系统翻车了,鸿蒙系统翻车了?任正非承认忽视了关键问题,称华为犯下大错误...
  • android10侧滑返回黑屏,Android实现类似IOS右滑返回的效果(原因分析及解决办法)
  • 华为 android 安全,华为 EMUI/Magic UI 安全更新 2020-3
  • 华为mate50麒麟处理器鸿蒙系统,华为Mate50Pro概念图:有鸿蒙OS,处理器你选择麒麟还是高通?...
  • 【comparator, comparable】小总结
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【技术性】Search知识
  • Laravel 实践之路: 数据库迁移与数据填充
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Node项目之评分系统(二)- 数据库设计
  • springboot_database项目介绍
  • 从零开始在ubuntu上搭建node开发环境
  • 观察者模式实现非直接耦合
  • 记一次和乔布斯合作最难忘的经历
  • 微服务入门【系列视频课程】
  • 一文看透浏览器架构
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 通过调用文摘列表API获取文摘
  • ​Java并发新构件之Exchanger
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • (2)Java 简介
  • (C++20) consteval立即函数
  • (编译到47%失败)to be deleted
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (四)库存超卖案例实战——优化redis分布式锁
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)iOS字体
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • ***监测系统的构建(chkrootkit )
  • .Net 垃圾回收机制原理(二)
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET的数据绑定
  • .NET企业级应用架构设计系列之结尾篇
  • .net实现客户区延伸至至非客户区
  • @Autowired和@Resource装配
  • [20180224]expdp query 写法问题.txt
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [ASP]青辰网络考试管理系统NES X3.5
  • [English]英语积累本
  • [I2C]I2C通信协议详解(二) --- I2C时序及规格指引
  • [jQuery]10 Things I Learned from the jQuery Source
  • [leetcode]_Symmetric Tree