为什么C语言要动态分配内存的意义?
1.C语言中的一切操作都是基于内存的
2.变量和数组都是内存的别名
---内存分配由编译器在编译期间决定的
---定义数组的时候必须指定数组长度
---数组长度是在编译期就必须确定的
需求:程序运行的过程中,可能需要使用一些额外的内存空间
实际使用就是malloc和free函数
用于内存的分配和释放
1.malloc所分配的是一块连续的内存
2.malloc一字节为单位,并且不带任何的类型信息
3.free用于将动态内存归还系统
void* malloc(size_t size)
void free(void* pointer)
注意:
1.malloc和free是库函数,不是系统调用
2.malloc实际分配的内存可能会比请求的多---有些编译器分配时是以4字节为单元的
3.不能依赖于不同平台的下的malloc
4.当请求的动态内存无法满足时malloc返回的是NULL
5.当free的参数为NULL时,函数直接返回
思考一个问题:malloc*(0);返回值是什么?*(这也是一个面试题)
#include
引出一个问题,这里不停的malloc,但是不free会造成内存泄露吗?
答案是会的,因为现代编译器一般是分配的4个整数字节,也就是申请的是0。但是实际分配的可能是4
解决的方式是:高级语言的(Java,.net.python等都是有内存回收功能的)
不过嵌入式基本都是使用C语言的(我做无人机的时候使用的是c++),那就得解决
下边是一个实际操作---内存泄露检测模块
gcc 38-1.c mleak.c (编译需要的所有文件)
#include
怎么实现内存检测的呢?
mleak.c函数
#include
mleak.h
#ifndef _MLEAK_H_
新概念
calloc和realloc
1.malloc的同胞兄弟
void* calloc(size_t num,size_t size);
void* realloc(void* pointer,size_t new_size);
2.calloc的参数代表所返回的内存的类型信息
---calloc会将=返回的内存初始化为0
3.realloc用于修改一个原先已经分配好的内存块的大小
---在使用realloc之后应该使用期返回值
---当pointer的第一个参数时NULL时,等价于malloc
实例使用:
#include
小结:
1.动态分配内存是C语言的强大功能
2.程序能够在需要的时候有机会使用更多的内存
3.malloc单纯的从系统中申请固定字节大小的内存
4.calloc能以类型大小为单位申请内存并初始化为0
5.relloc用于重置内存大小
说明
1.该文档仅供个人学习使用,版权所有,禁止商用。
2.本文由我一个人编辑并整理,难免存在一些错误。
3.为了方便大家平时公交、地铁、外出办事也能用手机随时随地查看该教程,该教程同步更新于微信公众号『Allen5G』。
我的微信公众号(ID:Allen5G)主要分享软件工程师进阶(嵌入式,Linux,C/C++,python,英语),程序员职业发展,如果想查看更多内容,可以关注我的微信公众号『Allen5G』