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

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所指向的堆区内存区域,内存空间分配如下图:


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

 

3、注意点

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值