1 问题提出
在使用数组的时候,总有一个问题困扰着我们,数组应该有多大,比如在单片机接收串口发送过来的数据时,应该准备多大的数组来接收数据比较合适?如果定义的数组比较小,那么便不能接收完整的一帧数据,如果定义的很大,对于单片机有限的RAM空间又会造成严重的浪费。
在使用modbus通讯时,单片机读取数据时,从机都会先发送两个字节的写数据个数,此时,程序如果可以根据这个数据长度字节从新定义一个数组来接收数据,岂不美哉!
因此,动态内存内存分配可以派上用场了,所谓动态内存分配,是指在程序的执行过程中,动态的分配,修改或回收存储空间的分配内存的方法。
2 动态内存的分配和管理
使用动态内存分配函数,需要包含 一下头文件
#include<stdlib.h>
2.1 分配内存空间函数 malloc
void *malloc (unsigned int size)
- 函数作用:在内存的动态存储区中分配一个长度为size的连续空间。
- 使用方式:
- 首先,创建一个指针变量,用来存放连续分配空间的首地址; 通过 malloc
- 函数分配出一个连续的内存空间,并将该空间的首地址赋值给上一步创建的指针变量;
- 按照数组的使用方式,使用指针变量;
#include<stdlib.h>
#include<stdio.h>
int main(void)
{
int count;
int *array;
array=(int*)malloc(10*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>
#include<stdio.h>
int main(void)
{
int count;
struct stu{
int i;
char c;
float f;
};
struct stu *array;
array=(struct stu*)calloc(3,sizeof(struct stu));
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)
#include<stdlib.h>
#include<stdio.h>
int main(void)
{
int count;
struct stu{
int i;
char c;
float f;
};
struct stu *array1;
int *array2;
array1=(struct stu*)calloc(3,sizeof(struct stu));
array2=(int*)malloc(10*sizeof(int));
free(array1);
free(array2);
return 0;
}
2.4 内存更改函数 realloc
void *realloc(*p, NewSize);
#include<stdlib.h>
#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;
}
|