当前位置: 首页 > news >正文

【堆和栈的区别】堆heap 和栈stack有什么区别(代码区、常量区、静态区(全局区)、堆区、栈区)...

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

//main.cpp 
int a = 0; 全局初始化区 
char *p1; 全局未初始化区 
main() 

int b; 栈 
char s[] = "abc"; 栈 
char *p2; 栈 
char *p3 = "123456"; 123456\0在常量区,p3在栈上。 
static int c =0; 全局(静态)初始化区 
p1 = (char *)malloc(10); 
p2 = (char *)malloc(20); 
分配得来得10和20字节的区域就在堆区。 
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 


二、堆和栈的理论知识 
2.1申请方式 
stack: 
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间 
heap: 
需要程序员自己申请,并指明大小,在c中malloc函数 
如p1 = (char *)malloc(10); 
在C++中用new运算符 
如p2 = (char *)malloc(10); 但是注意p1、p2本身是在栈中的。

http://www.cppblog.com/oosky/archive/2006/01/21/2958.html

代码区、常量区、静态区(全局区)、堆区、栈区

如下图,是自己总结的内存分区的示意图。一般内存主要分为:代码区、常量区、静态区(全局区)、堆区、栈区这几个区域。

代码区:存放程序的代码,即CPU执行的机器指令,并且是只读的。
常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”, 数组的名字等)
静态区(全局区):静态变量和全局变量的存储区域是一起的,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放
堆区:由程序员调用malloc()函数来主动申请的,需使用free()函数来释放内存,若申请了堆区内存,之后忘记释放内存,很容易造成内存泄漏
栈区:存放函数内的局部变量,形参和函数返回值。栈区之中的数据的作用范围过了之后,系统就会回收自动管理栈区的内存(分配内存 , 回收内存),不需要开发人员来手动管理。栈区就像是一家客栈,里面有很多房间,客人来了之后自动分配房间,房间里的客人可以变动,是一种动态的数据变动。
---------------------
原文:https://blog.csdn.net/u014470361/article/details/79297601

相关文章:

  • 【MODBUS】 协议
  • 【单机片调试】开发调试MSP430 遇到的问题总结
  • 【单片机程序和RAM】程序在RAM中调试的运行方式程序固化后运行方式
  • 【关于单片机的N多问题】关于单片机的N多问题
  • 【volatile关键字】 详解C中volatile关键字(IAR 优化等级问题)
  • 【下载进去无法运行】MSP430 程序能下载进去却无法运行
  • 【文章收藏】文章收藏
  • 【DATA16DATA20】MSP430中的DATA16和DATA20【Data model Large】
  • 【编程经验总结】编程经验总结
  • 【精确延时函数】IAR(MSP430)中的精确延时函数
  • 【Clng与Cint】clng与cint的区别及防溢出函数
  • 【寻址方式】直接寻址、位寻址、立即数寻址、寄存器寻址等
  • 【高效单片机语言结构】怎样最好地使用MSP430 编译器的建议
  • 【RS-485收发切换】使用RS-485要注意的一个问题
  • 【汇编指令】MSP430汇编指令
  • exports和module.exports
  • Golang-长连接-状态推送
  • javascript 哈希表
  • JavaScript服务器推送技术之 WebSocket
  • Java基本数据类型之Number
  • java取消线程实例
  • leetcode-27. Remove Element
  • Making An Indicator With Pure CSS
  • ReactNative开发常用的三方模块
  • Sublime Text 2/3 绑定Eclipse快捷键
  • sublime配置文件
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 免费小说阅读小程序
  • 智能合约Solidity教程-事件和日志(一)
  • 终端用户监控:真实用户监控还是模拟监控?
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #Linux(Source Insight安装及工程建立)
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (1)(1.11) SiK Radio v2(一)
  • (1)虚拟机的安装与使用,linux系统安装
  • (3)nginx 配置(nginx.conf)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (补)B+树一些思想
  • (六)vue-router+UI组件库
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (一)u-boot-nand.bin的下载
  • (转)关于pipe()的详细解析
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @KafkaListener注解详解(一)| 常用参数详解
  • @SuppressWarnings(unchecked)代码的作用