/*
2022.06.04
目的:
深入学习C语言内存管理
理论:
1.内存管理简介
a.常见内存使用错误:
——内存申请不成功,进行使用;
——内存申请成功,但没有初始化;
——内存初始化成功,但越界访问;
——忘记释放内存或者释放一部分。
b.内存管理不当的危害:
——没有初始化,会造成内存出错;
——越界访问内存可能会导致崩溃;
——忘记释放内存造成内存泄漏。
c.c语言的内存管理:
c语言中为用户提供了相应内存管理的API接口,需要开发者手动管理。
2.内存分区
a.代码区(text)
代码区用于存放程序指令,主要是二进制代码;
b.全局区或静态区(初始化数据区(data)和未初始化数据区(bss))
(1)静态区或全局区中存放未初始化的数据;
——未初始化的全局变量,该变量系统默认值为0;
——未初始化的静态局部变量,该变量系统默认值为0;
——未初始化的静态全局变量,该变量系统默认值为0;
(2)静态区或全局区中存放已初始化的数据;
——初始化的全局变量;
——初始化的静态局部变量;
——初始化的静态全局变量;
(3)字符串常量(只有分配空间的数据才可以使用,没有分配空间的无法使用);
c语言对字符串是按照字符数组来进行处理的,在内存中开辟了一个字符数组,用来存放该字符串常量,但是这个字符数中是没有名字的,只能通过指针变量来引用。
c.栈区(stack)
(1)当程序执行过程中,由程序自动开辟额外空间,由编译器自动分配释放,存放函数的参数值,局部变量的值等;
(2)局部变量、数组、结构体、指针变量、枚举、函数形参均在栈中存;
(3)申请时,只要栈的空间大于申请空间,系统将为程序提供内存,否则将报异常提示栈溢出;
d.堆区(heap)
(1)一般由程序员分配释放,若程序员不释放,程序结束时可能由系统回收(与数据结构中堆是两个概念);
3.内存越界
简单来说,就是在申请了一块内存后,在使用这块内存的时候,超出了申请的范围。
a.访问到野指针指向的区域,越界访问;
b.数组下标越界访问;
c.使用已经释放的内存;
d.企图访问一段释放的栈空间;
e.容易忽略字符串后面的‘\0’。
4.内存泄漏(Memory Leak)
是指程序中已经动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统等严重后果。
a.丢失了分配的内存首地址,导致无法释放;
b.丢失分配的内存地址;
c.企图希望传入指针变量获取对内存,殊不知是拷贝;
d.每循环一次,泄漏一次内存;
e.非法访问常量区。
功能:
*/
08-11
3112
03-14
2248
08-20
2939