dx在coding|内存的使用

嵌入式开发中,由于资源的有限,以我目前正在使用的一片MCU来举例,RAM空间是256K,但是如果所有的内存的使用都用静态分配的方式,这256K远远不够的,所以大多数的内存都是采用动态分配的方式申请和释放,从而更灵活的使用内存空间。


在C语言中申请内存会用到malloc、calloc和realloc,现在就简单讲一下这几个函数。


malloc

void* malloc(size_t size);

作用:用来向内存中申请一块连续的空间,如果申请成功,那么就返回指向这块内存的地址,如果申请失败返回NULL指针,在做开发时可以通过判断返回值,检查是否申请成功。

特点:申请的这块内存没有初始化,如果这块内存没有被用过,那就是全0的,如果被用过,可能会有其他数据,所以在使用之前,需要初始化一下。


calloc

void* calloc(size_t n,size_t size);

作用:在内存中申请n个大小为size的连续空间,如果申请成功,也是返回指向内存空间的指针,如果申请失败,同样也是返回NULL指针,这点和malloc相同。

特点:与malloc不同的是,calloc会初始化申请的内存空间,而malloc不会。


realloc

void* realloc(void* ptr,size_t size);

作用:调整原来申请内存的大小,如果调整成功,返回指向新分配的内存空间的指针,如果失败,返回NULL。

特点:realloc的size可以大于原来的长度,也可以小于原来的长度,如果大于原来的长度,会把原来的数据拷贝到新的地址,多出的部分不会初始化;如果小于原来的长度,可能会导致数据的丢失。realloc成功之后,原来的内存会被释放,不需要调用free。


既然有申请,也就需要释放,这样才能动态持续的分配和使用内存,如果申请的内存不被释放,可能会造成内存泄漏或者内存践踏的情况出现,系统会出现异常。


free

void free(void *ptr)

作用:释放由开发者主动申请的内存。

特点:调用free之后,指针指向的地址依然不变,但是地址的内容已经被释放改变,为了防止指针被异常调用,尽量在free之后,给指针赋值NULL。

内存动态分配的用法,使用上更加灵活,但是也可能出现内存泄漏,内存越界等问题,可以注意自己的编码方式,对指针的是否为空的判断、对返回值的判断等等,从而合理安全的使用内存动态分配。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值