c语言内存管理
计算机五区
计算机中,内存是分区管理的,主要分为五大区:静态存储区、代码存储区、栈存储区和堆存储区、常量区。
1.静态存储区
静态存储区是由操作系统分配和使用的,通常用于存储静态变量(及static 修饰的变量)和全局变量
通常是用于那些在编译期间就能确定存储大小的变量的存储区,但它用于的是在整个程序运行期间都可见的全局变量和静态变量。
全局区有 .bss段 和 .data段组成,可读可写。
.bss段
未初始化的全局变量和未初始化的静态变量存放在.bss段。
初始化为0的全局变量和初始化为0的静态变量存放在.bss段。
.bss段不占用可执行文件空间,其内容由操作系统初始化。
.data段
已初始化的全局变量存放在.data段。
已初始化的静态变量存放在.data段。
.data段占用可执行文件空间,其内容有程序初始化。
#include <>
//全局变量
int sum ;
int main(void){
//静态变量
static int number;
return 0 ;
}
2.代码区
代码区,代码区就是用来存放代码用的,在程序运行期间该内容是不可修改的.
3.栈存储区
栈 是由编译器和程序分配使用的,用来存放 auto 类型的变量–自动变量也就是局部作用域变量,栈存储区遵循先进后出的原则。通常来说,内存空间堆存储区>静态存储区>栈存储区,栈的内存空间最小。爆栈,也就是我们说的栈内存溢出,是经常见到的bug。以下这个变量就是存储在栈区。
#include <>
int main(void){
//局部变量
int age;
return 0 ;
}
4.堆存储区
堆存储区,是供程序员分配、使用的存储区,堆的空间很大,我们可以动态地申请内存空间。
动态申请的内存空间,要手动释放,所以说malloc和free是成对使用的。内存空间的寿命,一般是从分配空间开始,到程序结束或者被释放时结束的。
malloc函数
malloc就是我们所用到的动态申请内存空间的函数
//引入头文件
#include <>
//函数原型
void *malloc(size_t size)
//调用的形式
(类型说明符*) malloc(size)
//定义一个学生类型的结构体
struct student {
char name[20]; //姓名
char gender[3];//性别
char number[12]; //学号
char tel[12];//电话号码
short age;//年龄
//需要可以在添加
};
//结点
struct Node {
struct student data; //数据域
struct Node* next; //指针域
};
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
//返回值:分配空间的起始地址(分配成功);NULL(分配失败)
函数原型返回的是void*, 使用时必须做相应的强制类型转换。使用malloc申请的内存空间是连续的,而且分配的内存空间中的内容不确定,因此需要使用memset()进行初始化。
free函数
free函数用于释放之前动态申请的内存空间。
//引入头文件
#include <>
//函数原型
void free(void *ptr)
free(newNode);
//参数ptr
//指针指向所要释放的内存空间,该内存空间是之前使用malloc、calloc或者realloc动态申请的内存空间
如果ptr为NULL,那函数不会进行任何动作。
5.常量区
字符串、数字等常量存放在常量区。
const修饰的全局变量存放在常量区。
程序运行期间,常量区的内容不可以被修改。