C高级之内存管理(二)

动态内存分配函数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;

}


猜你喜欢

转载自blog.csdn.net/weixin_42048417/article/details/80187440
今日推荐