关闭

计算机内存中的堆与栈

2088人阅读 评论(0) 收藏 举报
分类:
一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表.
3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 

5、程序代码区—存放函数体的二进制代码。


例如:

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放在常量区

}


一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap。
栈是先入后出的,一般是由高地址向低地址生长。

还有就是函数调用时会在栈上有一系列的保留现场及传递参数的操作。栈的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用你操心。堆是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。在栈上存取数据比通过指针在堆上存取数据快些。

全局区的变量存储时由低到高,与栈相反。

全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域

4
0
查看评论

【计算机基础】程序数据的5种存储位置(堆与栈)

任何语言所编写的程序,其中的各类型的数据都需要一个存储位置,Java中数据的存储位置分为以下5种: 1.寄存器 最快的存储区,位于处理器内部,但是数量极其有限。所以寄存器根据需求进行自动分配,无法直接人为控制。 2.栈内存 位于RAM当中,通过堆栈指针可以从处理器获得直接支持。堆栈指针向下...
  • lzm18064126848
  • lzm18064126848
  • 2015-08-31 11:20
  • 3016

计算机中的堆和和栈(物理内存上的解释)

编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。我的意思是我理解什么是栈,但是它们到底是什么,在哪儿呢(站在实际的计算机物理内存的角度上看)? 1. 在通常情况下由操作系统(OS)和语言...
  • bai___DDD
  • bai___DDD
  • 2017-11-25 14:06
  • 254

数据结构中的栈和堆,计算机系统内存中的栈和堆的理解

数据结构中的栈和堆,计算机系统内存中的栈和堆的理解
  • mingge591
  • mingge591
  • 2016-04-13 11:26
  • 1209

堆和栈(明确的说明了计算机堆和栈的区别,令我受益很多)

 堆栈在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。要点:堆:顺序随意栈:先进后出堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存...
  • yxnchinahlj
  • yxnchinahlj
  • 2009-10-31 11:58
  • 1200

堆栈计算机的原理和实现

堆栈计算机的原理和实现 原书《 Stack Computers: the new wave 》 (原书封面) 原作者 Philip J. Koopman, Jr. 编译者 赵宇 张文翠 这是第一本讨论新一代堆栈计算机的书,而实现这种体系结构的第一块芯片是 Novix 公司的NC4016芯片。本书作者...
  • wxj729
  • wxj729
  • 2005-03-07 16:31
  • 15611

计算机中堆栈的概念

这两天学习win32的API, 了解到了计算机中堆栈的概念,相信很多程序员有时候也弄不明白计算机中的堆栈的数据结构。再次为堆栈做一下详细解析。在英文中,我们管栈称为stack,管堆称为heap。在计算机中,堆栈是两种不同的数据结构,但堆栈均为一种按序排列的数据结构。只能在一端对数据项进行插入和删除。...
  • BYR_SYR
  • BYR_SYR
  • 2013-02-06 12:27
  • 5840

C语言中堆和栈的区别

C语言中堆和栈的区别一.前言:C语言程序经过编译连接后形成编译、连接后形成的二进制映像文件由栈,堆,数据段(由三部分部分组成:只读数据段,已经初始化读写数据段,未初始化数据段即BBS)和代码段组成,如下图所示:1.栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值。其操作方式类...
  • tigerjb
  • tigerjb
  • 2012-04-03 16:04
  • 30199

计算机中的堆和栈【百度百科】

堆和栈的区别一、预备知识—程序的内存分配  一个由C/C++编译的程序占用的内存分为以下几个部分  1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。  2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能...
  • binbin1129
  • binbin1129
  • 2010-07-25 17:50
  • 2525

内存中堆栈的理解

堆栈 在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。 要点: 堆:顺序随意 栈:先进后出 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器...
  • liu_yude
  • liu_yude
  • 2015-04-15 14:08
  • 807

计算机内存中的堆与栈

一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配...
  • fengxinlinux
  • fengxinlinux
  • 2016-05-30 21:16
  • 2088
    个人资料
    • 访问:142779次
    • 积分:2204
    • 等级:
    • 排名:千里之外
    • 原创:69篇
    • 转载:2篇
    • 译文:0篇
    • 评论:84条
    博客专栏
    最新评论