C语言-动态内存分配

1 问题提出

在使用数组的时候,总有一个问题困扰着我们,数组应该有多大,比如在单片机接收串口发送过来的数据时,应该准备多大的数组来接收数据比较合适?如果定义的数组比较小,那么便不能接收完整的一帧数据,如果定义的很大,对于单片机有限的RAM空间又会造成严重的浪费。

在使用modbus通讯时,单片机读取数据时,从机都会先发送两个字节的写数据个数,此时,程序如果可以根据这个数据长度字节从新定义一个数组来接收数据,岂不美哉!

因此,动态内存内存分配可以派上用场了,所谓动态内存分配,是指在程序的执行过程中,动态的分配,修改或回收存储空间的分配内存的方法。

2 动态内存的分配和管理

使用动态内存分配函数,需要包含 一下头文件

#include<stdlib.h>    //使用 malloc(),calloc() 等函数需要包含的文件 

2.1 分配内存空间函数 malloc

  • 函数格式:
void *malloc (unsigned int size)
  • 函数作用:在内存的动态存储区中分配一个长度为size的连续空间。
  • 使用方式:
  1. 首先,创建一个指针变量,用来存放连续分配空间的首地址; 通过 malloc
  2. 函数分配出一个连续的内存空间,并将该空间的首地址赋值给上一步创建的指针变量;
  3. 按照数组的使用方式,使用指针变量;
  • 示例:
#include<stdlib.h>    //使用 malloc() calloc() 等函数需要包含的文件 
#include<stdio.h>
int main(void)
{
	int count;
	int *array;
	
	array=(int*)malloc(10*sizeof(int));//分配一个长度为 sizeof(int)的连续空间 
	
	printf("%d",sizeof(int));
	
	for(count=0;count<10;count++)
	{
		array[count]=count+1;
	}
	for(count=0;count<10;count++)
	{
		printf("\n%d",array[count]);
		
	}
	return 0;
}

2.2 分配内存空间函数 calloc

  • 函数格式:
(类型说明符*)calloc (n,size)
  • 函数作用:在内存动态存储区中分配 n 块长度为size 字节的连续区域。
  • 示例:
#include<stdlib.h>    //使用 malloc()  calloc() 等函数需要包含的文件 
#include<stdio.h>
int main(void)
{
	int count;
	struct stu{
		int i;
		char c;
		float f;
	};
	
	struct stu *array;
	
	/*在动态存储区中分配n块长度为'size'字节的连续区域,函数返回值为该区域的首地址*/
	array=(struct stu*)calloc(3,sizeof(struct stu));//分配一个长度为 sizeof(int)的连续空间 
	
	for(count=0;count<3;count++)
	{
		array[count].i=10;
		array[count].c='b';
		array[count].f=55.6;		
	}
	for(count=0;count<3;count++)
	{
		printf("\n%d",array[count].i);	
		printf("\n%c",array[count].c);	
		printf("\n%f",array[count].f);	

	}
	return 0;
}

2.3 内存释放函数 free

  • 函数格式:
void free(void *p)
  • 函数功能:释放指针p所指向的内存。其中,参数p必须是之前调用 malloc 函数 或 calloc 函数时返回的指针。

  • 示例

#include<stdlib.h>    //使用 malloc(),calloc() 等函数需要包含的文件 
#include<stdio.h>
int main(void)
{
	int count;
	struct stu{
		int i;
		char c;
		float f;
	};
	struct stu *array1;
	int  *array2;
	
	/*在动态存储区中分配n块长度为'size'字节的连续区域,函数返回值为该区域的首地址*/
	array1=(struct stu*)calloc(3,sizeof(struct stu));//分配一个长度为 sizeof(int)的连续空间 
	array2=(int*)malloc(10*sizeof(int));//分配一个长度为 sizeof(int)的连续空间 
	free(array1);//释放内存 
	free(array2);//释放内存 
	return 0;
}

2.4 内存更改函数 realloc

  • 函数格式
void *realloc(*p, NewSize);
  • 函数 realloc 的功能是,把之前通过 malloc 函数 或 calloc 函数时返回的指针p,所指向的区域的大小更改为新的NewSize长度,使用该函数的好处是,不用通过free函数释放存储空间,可以直接修改存储空间的长度。

  • 示例

#include<stdlib.h>    //使用 malloc(),calloc() 等函数需要包含的文件 
#include<stdio.h>

int main(void)
{
	int *pp;
	int i;
	pp = (int *)malloc(sizeof(int)*10);
		
	pp = (int *)realloc(pp,sizeof(int)*5);//从新分配一个更小的内存 
	if(pp!=NULL)
	{
		printf("内存分配成功\n"); 
	} 
		
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驽马同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值