`
alexander008
  • 浏览: 2257 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

堆栈区别

阅读更多
堆和栈常常连在一起读,所以被人常误认为堆栈是一种东西。

从数据结构来说
其实不是,堆是堆,栈是栈。堆是一种特殊的完全二叉树。而栈是所谓LIFO(先进后出)的线性表。


从操作系统来说
在C/C++的程序中,内存常常分为几大块

1、栈区(Stack)—用于存储局部变量,参数。是由编译器自动分配和释放的,其操作方式类似于数据结构中的栈。

2、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

4、文字常量区 — 常量字符串就是放在这里的,程序结束后由系统释放 。

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

例子程序

这是一个前辈写的,非常详细
//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"优化成一个地方。 
} 
分享到:
评论

相关推荐

    C-C++中堆栈的区别

    理解这两者的区别对于优化程序性能和避免内存管理问题至关重要。 首先,栈(Stack)是程序运行时由编译器自动管理的内存区域。栈上的内存分配遵循“后进先出”(LIFO)原则,这与数据结构中的栈类似。栈主要用于...

    堆栈内存区别

    ### 堆栈内存区别详解 在计算机编程与运行环境中,堆栈(Heap vs Stack)是两种关键的数据存储区域,它们各自拥有独特的属性与管理方式,对于程序的性能与资源管理有着深远的影响。本文将深入解析堆栈的区别,探讨...

    C51堆栈构成与空间需求分析

    这与硬件堆栈有所区别,硬件堆栈是指单片机内置的系统堆栈,它在内部RAM中,并且大小有限。模拟栈的概念对于设计中需要重入函数的应用场景来说,非常重要。 标签中的"C51堆栈"是一个关键词,指出了本文主题的具体...

    线性表、堆栈、队列

    线性表、堆栈和队列是数据结构与算法中的基础概念,它们在计算机科学中扮演着重要角色。本文将详细讲解这三个概念以及C++实现的相关知识点。 首先,线性表是一种最基本的数据结构,它是由n(n>=0)个相同类型元素...

    java 堆栈的演示程序

    4. 深入理解JVM的内存模型,特别是堆栈和堆的区别,以及垃圾回收对堆的影响。 总之,这个"java 堆栈的演示程序"为我们提供了一个实践和学习Java内存管理的绝佳机会,无论是对于初学者还是经验丰富的开发者,都能...

    堆栈的区别

    #### 三、堆栈区别总结 1. **内存分配方式**: - 堆内存支持动态分配,而栈内存则是在程序执行前就已经确定大小。 2. **生命周期**: - 堆内存分配的对象生命周期不确定,直到被垃圾回收;栈内存中的数据随着...

    教你识别背照式和堆栈式摄像头元件的区别

    【摄像头元件】是现代智能手机摄像头的关键组成部分,主要分为两种类型:背照式传感器和堆栈式传感器。这两种传感器的设计差异显著影响了它们的性能和成像质量。 **背照式传感器(Backside Illumination Sensor)**...

    操作系统中的堆栈的经典解释

    本文将深入探讨操作系统层面的堆栈概念及其区别,并结合具体的代码实例进行说明。 #### 一、基本概念 **1. 堆栈(Stack)** - **定义**: 堆栈是一种后进先出(Last In First Out, LIFO)的数据结构,在内存中表现...

    JVM堆栈性能分析

    Thread Dump 是非常有用 Java应用问题的工具。每一个 Java 虚拟机 都有及时生成所有线程在某...照,及JVM 中所有 Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名 及所执行的方法,如果可能的话还有源代码的行数。

    堆栈的名词解释

    #### 四、堆栈之间的区别 1. **内存分配方式**: - 堆:手动分配与释放,使用`new`或`malloc`等函数。 - 栈:自动分配与释放,由编译器管理。 2. **内存分配效率**: - 堆:分配和释放开销大。 - 栈:分配和...

    MCS-51单片机的堆栈及其应用

    - 需要注意子程序调用与中断之间的区别,特别是在处理中断返回时。 - 通常情况下,子程序与中断服务程序不宜混用,因为中断返回指令(RETI)还会重新启用之前被禁用的中断功能。 - 在编写中断服务程序时,需要考虑中断...

    关于堆栈的详细介绍

    通过对堆栈的基本概念及其在数据结构与程序内存管理两个维度的深入探讨,我们不仅了解了堆栈各自的特点和应用场景,还掌握了它们之间的主要区别。对于C/C++程序员而言,深入理解这些概念有助于提高编程效率,避免...

    队列 堆 栈 堆栈的区别

    ### 队列、堆、栈与堆栈的区别 #### 队列 队列是一种遵循先进先出(First In First Out, FIFO)原则的数据结构。这意味着最先加入队列的元素将会是最先被移除的元素。队列常用于处理需要按照顺序执行的任务集合,...

    栈和堆栈的区别.doc

    ### 栈和堆栈的区别详解 #### 一、程序的内存分配 在深入探讨栈和堆的区别之前,我们首先需要了解程序在运行时是如何管理内存的。程序在运行时主要可以划分为以下几部分: 1. **栈区(Stack)**: - 分配与释放...

    数据结构 堆栈和队列

    * 另设一个标志位以区别队列是满还是空。 堆栈和队列是两种基本的数据结构,它们在计算机科学中有广泛的应用。理解堆栈和队列的实现原理和特点是非常重要的,才能更好地应用它们来解决实际问题。

    编程中堆栈的区别

    以下是对堆和栈区别的详细解释: 1. **预备知识:程序内存分配** - **栈区(Stack)**:栈是用于存放函数参数值和局部变量的地方,由编译器自动分配和释放。它的特点是后进先出(LIFO),类似数据结构中的栈。 - ...

    java堆栈的区别 -- 详解

    ### Java堆栈的区别详解 #### 一、预备知识—程序的内存分配 程序在运行时,根据不同的数据类型和用途,会被分配到不同的内存区域。这些区域包括: 1. **栈区(Stack)**:这部分内存由编译器自动管理,主要用于...

    栈和堆栈的区别和联系

    标题和描述中的核心知识点主要集中在计算机科学领域中的数据存储机制,特别是栈(stack)和堆(heap)的区别和联系。为了深入理解这些概念,我们不仅需要掌握它们的基本定义,还要了解它们在实际编程中的应用以及与其他...

    C++中堆和栈的区别

    "C++中堆和栈的区别" C++中堆和栈是两种不同的内存分配方式,它们在编程中扮演着重要的角色。理解堆和栈的区别是非常必要的,因为它关系到程序的正确性、效率和可靠性。 堆(Heap)是一种动态内存分配方式,它是由...

    什么是堆栈

    堆栈是编程语言中非常重要的概念,今天我们将深入剖析堆栈的概念,并详细解释堆和栈的区别。 首先,让我们来了解堆栈的五个内存分区。在 C++ 中,内存被分成五个区:堆、栈、自由存储区、全局/静态存储区和常量存储...

Global site tag (gtag.js) - Google Analytics