【嵌入式——C语言】动态内存申请

本文介绍了C语言中静态分配与动态内存分配的区别,重点讲解了malloc、free、calloc和realloc等内存管理函数的用法,以及如何避免内存泄漏问题。
摘要由CSDN通过智能技术生成

静态分配

在程序编译或运行的过程中,按事先规定大小分配内存空间的分配方式,必须事先知道所需的空间大小,分配在栈区或全局变量区,一般以数组形式存在,按计划分配。

动态分配

在程序运行过程中,根据需要的大小自由分配所需的空间,按需分配,分配在堆区,一般使用特定的函数进行分配

动态分配函数

需要包含#include <stdlib.h>

malloc函数

在内存的动态存储区中分配一块长度为size字节的连续区域用来存放类型说明符指定的类型。

void* malloc(unsigned int size);

分配成功返回分配空间的起始地址,分配失败返回NULL,在调用malloc函数之后一定要判断一下是否分配成功,如果多次malloc申请内存,第一次和第二次申请的内存不一定是连续的。

int i,  * array, n;
printf("输入要申请的数组元素个数\n");
scanf_s("%d",&n,4);
array = (int*)malloc(n * 4);
if (array == NULL) {
 printf("申请内存失败\n");
 return 0;
}
for (int i = 0; i < n; i++) {
  array[i] = i;
}

free函数

释放内存

void free(void* ptr)

ptr指向的内存必须是由malloc calloc relloc 动态申请的内存。

free(array);

free之后,因为没有给array赋值,所以array还是指向原先动态申请的内存,但是内存已经不能再用了,所以array变成野指针了。一块动态申请的内存,只能释放一次,不能多次free。

calloc函数

void * calloc(size_t  _Count,size_t  _Size)

size_t 是无符号整型,是在头文件中用typedef定义出来的。在内存的堆中,申请_Count块,每块的大小为_Size个字节连续的区域,分配成功返回分配空间的起始地址,分配失败返回NULL。

char* p = (char*)calloc(3, 100);//申请3块,每块大小是100字节,300个字节是连续的
array = (int*)calloc(n *,4);

malloc函数和calloc函数区别

  • 函数名字不一样;
  • 参数个数不一样;
  • malloc申请的内存,内存中存放的内容是随机的,calloc申请的内存中存放的内容是0。

realloc函数

重新申请内存

void* realloc(void*  _Block, size_t _Size) 

在原先s指向的内存的基础上重新申请内存,新的内存大小_Size个字节。如果原先的内存后面有足够大的内存就追加,如果后面内存不够用就在堆区中找一个_Size个字节大小的内存申请,将原先内存中的内容拷贝过来,释放原先的内存,然后返回新内存的地址。如果新内存的大小比原先内存小,就释放掉原先内存的后面的存储空间,只留_Size个字节大小的空间。

p = (char*)realloc(p, 150);

内存泄漏

申请的内存,首地址丢了,没法使用也没法释放,这块内存就被泄露了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值