### 动态分配内存
可以在程序运行的时候,临时决定需要分配多少个存储区,这种分配存储区的方法叫做动态分配。
为了管理动态分配的内存需要使用一组标准函数。
为了使用这些标准函数需要包含stdlib.h头文件。
**malloc**
这个函数可以动态的分配一组连续的字节。
这个函数需要一个整数类型的参数表示希望分配的字节个数。
它的返回值代表分配好的第一个字节的地址。
如果分配失败,则返回值是NULL。
返回值记录在一个无类型的指针存储区里,使用之前需要先进行转换。
动态分配内存使用完以后需要使用专门的函数调用语句把它还给计算机,也就是释放掉不用的内存,这就叫做释放动态内存。
#include <stdio.h>
#include <stdlib.h>
int main(){
int *p_num = (int *)malloc(5 * sizeof(int));
return 0;
}
**calloc**
calloc函数也可以动态的分配一组连续的同类型存储区。
这个函数可以把所有动态分配的存储区内存设置成0。
这个函数也需要包含stdlib.h的头文件。
这个函数需要两个参数,第一个参数表示要分配的存储区个数,第二个参数表示单个存储区的大小。
calloc(5, sizeof(int))
这个函数的返回值也是分配好的第一个存储区的地址。
这个函数也有可能失败,如果失败则返回值是NULL。
**realloc**
realloc函数可以调整一段动态分配内存中存储区的个数。
这个函数工作比较复杂,耗时比较长,因此尽量少使用这个函数。
**free**
free函数可以用来释放动态内存。
这个函数需要第一个字节的地址作为参数。
一起分配的所有内存必须一起释放。
如果使用指针作为参数调用free函数,则函数结束后指针将成为野指针,必须恢复成空指针。
动态分配内存实例,包括分配内存,释放内存和使用分配的内存:
动态分配的内存使用方式和数组是一样的。
#include <stdio.h>
#include <stdlib.h>
int main(){
int num = 0;
int *p_num = (int *)malloc(5 * sizeof(int));
if (p_num){
for (num = 0;num <= 4;num++){
*(p_num + num) = num;
}
for (num = 0;num <= 4;num++){
printf("%d ", *(p_num + num));
}
printf("\n");
free(p_num);
p_num = NULL;
}
return 0;
}
调用函数可以使用被调用函数动态分配的存储区。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int *create (int size){
int num = 0;
int *p_num = NULL;
p_num = (int *)malloc(size * sizeof(int));
if (!p_num){
return NULL;
}
srand(time(0));
for (num = 0;num <= size - 1;num++){
*(p_num + num) = rand() % 36 + 1;
}
return p_num;
}
int main(){
int size = 0, num = 0;
int *p_num = NULL;
printf("请输入彩票的个数: ");
scanf("%d", &size);
p_num = create(size);
if (!p_num){
return 0;
}
for (num = 0;num <= size - 1;num++){
printf("%d ", *(p_num + num));
}
printf("\n");
free(p_num);
p_num = NULL;
return 0;
}
动态分配内存能不用则不要使用,因为在以后的开发过程中,很有可能会因为没有释放掉动态分配的内存从而导致内存溢出。