动态内存分配函数malloc()和free()
当我们需要动态地申请一块内存空间的时候,我们可以使用malloc() 函数在内存中的堆区开辟一块空间。当不再使用这块内存存储数据时,必须使用free() 函数释放这块内存。
关于这两个函数具体介绍,可以使用man 命令在shell下进行查看,查看方式:
man 3 malloc
man 3 free
函数原型:void* malloc(unsigned int size);
参数:需要申请的内存大小(单位:字节)
返回值:void*型指针(成功)或NULL(失败)
说明:
1. void*类型指针无法直接使用,必须通过强制类型转换将void*类型指针转换成指定类型的指针,如果想要在申请的内存中存储 int型数据,则需要转换成(int *),如果想要在申请的内存中存储 char型数据,则需要转换成(char *)。
2. 返回值为NULL,代表申请内存失败,所以必须判断返回值是否为NULL。
函数原型:void free(void *p)
参数:需要释放的地址
返回值:无
说明:
1. malloc后的内存空间用完后如果不释放,容易造成内存泄漏。
2. free()函数释放一个指针,这个指针必须置NULL, 否则调用free()函数将指针指向的内存空间释放掉后,该指针并不是空指针,此时指针属于野指针,存放了一块未知内存地址。如果第二次free()的话则会释放这块未知内存地址的内存空间,容易造成系统崩溃。
示例:使用malloc()函数申请一块空间存放一个数组,这个数组用来存放整数,数组的大小手动输入,数组存放的数据也需要手动输入,并在使用完毕后回收这块区域。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
inti, n;
int*p = NULL;
printf("Inputthe size of array!\n");
scanf("%d",&n);
p= (int *)malloc(sizeof(int) * n);
if(p== NULL)
{
perror("Mallocerror!");
return1;
}
i= 0;
while(i< n)
{
printf("Input%d nummer\n",i+1);
scanf("%d",p+i);
i++;
}
printf("Youinput number as follows!\n");
for(i= 0; i < n; i++)
{
printf("%d",*(p+i));
}
printf("\n");
free(p);
p= NULL;
printf("Mallocmem release!\n");
return0;
}