C语言修行之归纳篇(三)操作系统管理内存:栈(stack)、堆(heap)、数据区(.data)对比表

本文详细介绍了操作系统的内存管理,包括栈、堆和数据段的作用和特性。栈用于存放局部变量,由操作系统自动管理,而堆则提供更灵活的内存分配,需要程序员手动申请和释放。数据段包含初始化的全局变量和代码段。栈内存有限,易发生溢出,堆内存可能造成内存泄漏。理解这些概念对于优化程序性能和防止内存问题至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

操作系统管理内存对比表
栈(stack)堆(heap)数据区(.data)
代码段数据段bss段
存放类型 普通局部变量用户使用内存比较大,需要反复使用和释放。(链表、结构体会使用堆管理内存)程序中的可执行部分,也可以理解代码段就是函数堆叠组成的C语言程序中的全局变量C语言程序中的全局变量
特点应用程序在操作系统中运行时,操作系统分配一块栈空间给应用程序使用。栈大小由操作系统决定的。栈指针是由操作系统控制(栈的先进后出特性)操作系统堆管理器管理:堆管理器是操作系统的一块模块,堆管理内存分配灵活,按需分配。存放显示初始化为非零的全局变量。存放显示初始化为0或者没有显示初始化的全局变量
栈是在运行时自动分配和自动收回:栈是自动管理的、程序员不需要手工干预。程序手动申请和释放:需要程序员写代码去申请malloc和释放free。
反复使用:栈内存在程序中其实就是一块空间,程序反复使用这一块空间。大块内存:堆内存管理者总量很大的操作系统内存块,各程序按需向操作系统去申请,使用完之后要释放。
脏内存:由于栈是反复使用的,每次使用后程序不会清理,因此分配到时保留原来的值脏内存:堆内存也是反复使用的,使用者用完释放前不会清除。
临时性:变量在栈上只是临时分配了一个内存空间使用临时性:堆内存只有在malloc和free之间属于这个进程,可以访问。
栈会溢出:操作系统分配的栈大小是有限的。大量使用栈会造成栈溢出。堆申请内存容量不限。但如果申请的内存没有释放,就会造成内存泄漏。
特殊字符C语言中使用char *p=“linux”;
定义字符串,这个字符串不会被放在数据段,而是会被分配为代码段。
这个字符串属于常量字符串而不是变量字符串。
const型常量,C语言中const关键字用来定义常量,常量就是不能被改变的量。
const类型实现方法:
1、单片机的编译器编译将const修饰的变量放在代码段去实现不能修改
2、gcc编译器是用来检查const类型的常量不会被修改,实际上const型的常量还是和普通变量一样放在数据段的。
优点C语言中栈的操作是方便的。分配和最后的回收栈空间不需要程序员去操心。C语言自动完成。使用自由(随时申请、释放,大小可随意)。
缺点栈是有长度的。栈内存不灵活,大小不好设置。(如果栈太小怕溢出,栈太大浪费) 在C语言中定义局部变量时不能定义太大,如数组成员不能太大int a[1000000];申请malloc和释放free都需要程序员写代码手动实现。如果申请的内存没有释放,就会造成内存泄漏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Bazinga bingo

您的鼓励就是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值