c语言内存管理

c语言内存管理

计算机五区

计算机中,内存是分区管理的,主要分为五大区:静态存储区、代码存储区、栈存储区和堆存储区、常量区。

1.静态存储区

静态存储区是由操作系统分配和使用的,通常用于存储静态变量(及static 修饰的变量)和全局变量
通常是用于那些在编译期间就能确定存储大小的变量的存储区,但它用于的是在整个程序运行期间都可见的全局变量和静态变量。
全局区有 .bss段 和 .data段组成,可读可写。

.bss段

未初始化的全局变量和未初始化的静态变量存放在.bss段。
初始化为0的全局变量和初始化为0的静态变量存放在.bss段。
.bss段不占用可执行文件空间,其内容由操作系统初始化。

.data段

已初始化的全局变量存放在.data段。
已初始化的静态变量存放在.data段。
.data段占用可执行文件空间,其内容有程序初始化。
#include <stdio.h>

//全局变量
int sum ;

int main(void){
    //静态变量
    static int number;
    
    
    return 0 ;
}

2.代码区

代码区,代码区就是用来存放代码用的,在程序运行期间该内容是不可修改的.

3.栈存储区

栈 是由编译器和程序分配使用的,用来存放 auto 类型的变量–自动变量也就是局部作用域变量,栈存储区遵循先进后出的原则。通常来说,内存空间堆存储区>静态存储区>栈存储区,栈的内存空间最小。爆栈,也就是我们说的栈内存溢出,是经常见到的bug。以下这个变量就是存储在栈区。

#include <stdio.h>

int main(void){
   //局部变量
	int age;
   return 0 ;
}

4.堆存储区

堆存储区,是供程序员分配、使用的存储区,堆的空间很大,我们可以动态地申请内存空间。

动态申请的内存空间,要手动释放,所以说malloc和free是成对使用的。内存空间的寿命,一般是从分配空间开始,到程序结束或者被释放时结束的。
malloc函数

malloc就是我们所用到的动态申请内存空间的函数

//引入头文件
#include <stdlib.h>

//函数原型
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 <stdlib.h>


//函数原型
void free(void *ptr)
 
    
    free(newNode);
//参数ptr   
//指针指向所要释放的内存空间,该内存空间是之前使用malloc、calloc或者realloc动态申请的内存空间

如果ptr为NULL,那函数不会进行任何动作。

5.常量区

字符串、数字等常量存放在常量区。
const修饰的全局变量存放在常量区。
程序运行期间,常量区的内容不可以被修改。
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Conan_Ritchie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值