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的内存空间。
③ 同一块堆区的内存只能释放一次。
④ 释放不是指内存没了或者消失了,而是指用户不能继续使用这块内存,它被系统回收了,如果继续使用的话需要再申请内存,不然就是非法操作了。
⑤ 这里需要注意内存泄漏和内存污染
内存泄漏:指动态分配了内存空间但没有释放掉。
内存污染:指非法使用内存,比如操作野指针。