IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> C语言-动态内存分配 -> 正文阅读

[嵌入式]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;
}
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 10:06:25  更:2022-05-14 10:07:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 1:18:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码