操作系统管理内存:栈(stack)、堆(heap)、数据区(.data)对比表 (持续更新中....)

操作系统管理内存对比表

栈(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都需要程序员写代码手动实现。如果申请的内存没有释放,就会造成内存泄漏。

你可能感兴趣的:(C语言对比精粹,c语言,数据结构)