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



