c语言内存管理

时间:2025-01-25 16:06:01

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修饰的全局变量存放在常量区。
程序运行期间,常量区的内容不可以被修改。