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语言中动态内存分配的资料讲解,如有疑问请大家留言或者到本站社区讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 10.13面试:什么是跨域?如何解决跨域问题+springMVC如何处理文件上传和下载+ssm整合思路 (待完善)
- 查找jar地址
- shiro篇:缓存配置
- 定时器篇:定时任务入门小案例
- 设置SSH + 远程仓库操作
- SSM整合:商城小项目001(配置SSM环境+查询所有操作+添加操作)
- 在MyBatis中参数的传递4种方式+代码示例
- MySQL篇:MySQL5.5和 MySQL5.7.x 版本安装和卸载《从入门到入狱,删库--->你值得拥有》
- 1016面试:quartz的核心组件+cron表达式语法+如何实现一个每天中午12点备份的数据库?写伪代码
- shiro篇:使用Shiro对一个SSM项目进行身份加密验证
- 由Spring创建dao和service
- “终于懂了” 系列:Android组件化,全面掌握!
- Requests库快速学习
- 简单易懂的springMVC中的测试类
- 花了一个星期,我终于把RPC框架整明白了!