欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【c语言学习笔记】malloc和free函数

程序员文章站 2022-03-09 15:11:13
...

1、函数原型

① void *malloc(size_t size)
功能:在堆区(动态存储区)分配一块长度为size字节的连续区域的内存空间,用来存放指定的类型,并返回一个指向该内存地址的指针。
参数:size为需要分配的内存的大小,单位是byte。
返回值:成功返回分配空间的首地址,失败返回空指针NULL。
头文件:stdlib.h

② void free(void *ptr)
功能:释放指针ptr所指向的一块内存空间,如果对同一块内存区域多次释放的话会出错。
参数:ptr指向被释放区域的首地址,它是一个任意类型的指针变量。
返回值:无
头文件:stdlib.h

 

2、程序分析

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 int main(void)
  5 {
  6         int *ptr;
  7         ptr = (int *)malloc(sizeof(int));
  8         if(ptr == NULL)
  9         {
 10                 printf("Allocation failed!\n");
 11                 return -1;
 12         }
 13         *ptr = 10;
 14         printf("ptr = %p\n", ptr);
 15         printf("*ptr = %d\n", *ptr);
 16         if(ptr != NULL)
 17         {
 18                 free(ptr);
 19                 ptr = NULL;
 20         }
 21         printf("ptr = %p\n", ptr);
 22         return 0;
 23 }

 

结果:
ptr = 0x55d7aa168260
*ptr = 10
ptr = (nil)

 

分析:指针变量ptr是在栈区的,而且ptr没有初始化,这里通过malloc函数在堆区申请了一块内存区域给指针ptr,如果没有申请成功则ptr为NULL,如果申请成功就对该内存区域赋值为10,ptr地址为0x55d7aa168260,最后处理成功后需要释放ptr所指向的堆区内存区域,内存空间分配如下图:

【c语言学习笔记】malloc和free函数


这里需要注意:释放内存后指针还是指向0x55d7aa168260这个地址的,所以程序上需要将ptr指向NULL。 

 

3、注意点

① 动态分配的内存空间如果程序没有结束,该内存是不会自动释放的,所以一般使用完后需要手动进行释放,这里使用的就是free()函数进行释放。

② free(ptr)不是释放指针变量ptr,而是释放ptr所指向的内存空间,如上程序对应地址0x55d7aa168260的内存空间。

③ 同一块堆区的内存只能释放一次。

④ 释放不是指内存没了或者消失了,而是指用户不能继续使用这块内存,它被系统回收了,如果继续使用的话需要再申请内存,不然就是非法操作了。

⑤ 这里需要注意内存泄漏和内存污染
内存泄漏:指动态分配了内存空间但没有释放掉。
内存污染:指非法使用内存,比如操作野指针。

相关标签: C/C++