开发者学堂课程【你的第一门 C 语言课:快速学习动态内存管理】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/444/detail/5486
快速学习动态内存管理
内容介绍:
一、 更灵活的内存管理方式
二、 Moalloc
三、 Free
四、 内存泄漏
一、更灵活的内存管理方式
- Malloc
——申请动态内存空间
- Free
——释放动态内存空间
- Calloc
——申请并初始化一系列内存空间
- Realloc
——重新分配内存空间
二、Malloc
- 函数原型:
——void *malloc(size_ t size);
- malloc 函数向系统申请分配 size 个字节的内存空间,并返回一个指向这块空间
的指针。
- 如果函数调用成功,返回一个指向申请的内存空间的指针,由于返回类型 void
指针(void *),所以它可以被转换成任何类型的数据;如果函数调用失败,返回值是 NULL。另外,如果 size 参数设置为0,返回值也可能是 NULL,但这并不意味着函数调用失败。
- 举例:
#include
int main( )
{
int *ptr;
ptr = (int * )malloc(sizeof(int));
if (ptr == NULL)
{
printf("分配内存失败! \n");
exit(1) ;
}
printf("请输入一个整数: ");
scanf("%d", ptr);
printf("你输入的整数是: %d\n", *ptr);
return 0;
}
运行:gcc test1.c ss ./a.out
结果:请输入一个整数: 520
你输入的整数是:520
三、free
- 函数原型:
——void free(void *ptr);
- free 函数释放 ptr 参数指向的内存空间。该内存空间必须是由 malloc、calloc
或 realloc 函数申请的。
否则,该函数将导致未定义行为。如果 ptr 参数是 NULL,则不执行任何操作。
注意:该函数并不会修改 ptr 参数的值,所以调用后它代然指向原来的地方(变为非法空间)。
- 举例:
#include
.
h>
#include
int main( )
{
int *ptr;
ptr = (int * )malloc(sizeof(int));
if (ptr == NULL)
{
printf("分配内存失败! \n");
exit(1) ;
}
printf("请输入一个整数: ");
scanf("%d", ptr);
printf("你输入的整数是: %d\n”
,
*ptr) ;
free(ptr) ;
printf("你输入的整数是: %d\n", *ptr);
return 0;
}
运行:gcc test1.c ss ./a.out
结果:请输入一个整数; 520
你输入的整数是:520
你输入的整数是:0
四、内存泄漏
举例:
#include
h>
#include
int main( )
{
while(1)
{
malloc(1024)
}
return o;
}
运行:gcc test1.c ss ./a.out
结果:
K
illed
- 会报错
- 总结一下,导致内存泄漏主要有两种情况:
——隐式内存泄漏(即用完内存块没有及时使用 free 函数释放)
——丢失内存块地址