`
凤凰涅磐
  • 浏览: 86565 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

堆(heap)与栈(stack)的区别

阅读更多

堆(heap)和栈(stack)
2007/11/17 13:26

1、管理方式不同:栈(stack)由编译器管理;堆(heap)由程序员管理。 
2、空间大小不同:win32中,堆(heap)可达4G;VC中栈默认1M(可以修改)。 
3、碎片问题:堆(heap)易产生;栈(stack)不会。 
4、生长方向不同:堆(heap)生长方向是向上的,也就是向着内存增加的方向;栈(stack)相反。 
5、分配方式不同:堆(heap)是动态的,没有静态的堆;栈(stack)有两种:动态和静态。 
6、分配效率不同:栈(stack),系统提供底层支持,有专门的寄存器存放栈地址,效率高;堆(heap),由库函数提供支持,效率底。  

一般认为在c中分为这几个存储区 

1栈 - 有编译器自动分配释放 
2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 
3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放 
4另外还有一个专门放常量的地方。 - 程序结束释放 

在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在 所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函 数中的"adgfdf"这样的字符串存放在常量区。比如: 

代码: 

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++的工程的程序员,都会对malloc或是new有些感冒。当你什么时候在使用malloc和new时,有一种轻度的紧张和惶恐的感觉时,你就具备了这方面的修养了。
对于malloc和free的操作有以下规则:
1) 配对使用,有一个malloc,就应该有一个free。(C++中对应为new和delete)

2) 尽量在同一层上使用,不要像上面那种,malloc在函数中,而free在函数外。最好在同一调用层上使用这两个函数。

3) malloc分配的内存一定要初始化。free后的指针一定要设置为NULL。
分享到:
评论

相关推荐

    堆(heap)与栈(stack)的区别

    堆(heap)与栈(stack)是计算机内存管理中的两种基本数据结构,用于存储程序运行时产生的临时变量。在C语言中,这两种内存区域有非常明确的区分,对于理解程序的内存分配和回收具有重要意义。 首先,栈是一种特殊...

    java中堆(heap)和堆栈(stack)有什么区别

    "Java 中堆(heap)和堆栈(stack)的区别" Java 中堆(heap)和堆栈(stack)是两个不同的内存区域,分别用于存储不同的数据类型和对象。堆栈(stack)是 Java 中的一种内存区域,用于存储基本类型的变量和对象的...

    堆(heap)和栈(stack)的区别

    堆(heap)和栈(stack)的区别 堆(heap)和栈(stack)是计算机科学中两个基本的内存分配概念,它们之间的区别是非常重要的。本文将详细介绍堆和栈的概念、差异、特点和应用场景。 一、预备知识—程序的内存分配 一个由...

    c语言stack(栈)和heap(堆)的使用详解

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

    stack&heap

    理解堆和栈的区别和用法对于优化程序性能和避免内存问题至关重要。 1. **栈区(Stack)** 栈是程序运行时由编译器自动分配和释放的内存区域。它遵循“先进后出”(LIFO,Last In First Out)的原则,主要用于存储...

    内存中堆和栈的分配区别

    在计算机科学领域,内存管理是实现程序高效运行的关键技术之一,而其中的堆(Heap)与栈(Stack)是两种核心的内存分配方式。本文将深入探讨这两种内存区域的分配区别,以及它们在程序中的作用机制,帮助读者理解C/...

    C语言入门-堆与栈的区别

    在C语言的学习过程中,理解堆(Heap)与栈(Stack)的概念及其区别是非常重要的。本文将详细介绍这两种数据结构的特点、用途以及它们之间的主要区别,帮助初学者更好地掌握C语言中的内存管理技巧。 #### 一、栈...

    Java中堆内存与栈内存分配浅析

    程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的工作原理及其区别对于优化程序性能、避免内存泄漏等问题至关重要。本文将深入探讨Java中堆内存与栈内存...

    堆与栈的区别(非常经典)

    ### 堆与栈的区别(非常经典) #### 一、预备知识—程序的内存分配 在探讨堆与栈的区别之前,我们首先需要了解一个由 C/C++ 编译的程序是如何进行内存分配的。通常情况下,一个程序可以分为以下几个部分: 1. **...

    深入堆与栈 堆与栈的区别

    ##### 示例2:字符串常量池与堆的区别 ```java String s0 = "kvill"; String s1 = "kvill"; String s2 = "kv" + "ill"; System.out.println(s0 == s1); System.out.println(s0 == s2); ``` 这里涉及到字符串常量池...

    堆与栈的区别

    以下是关于堆和栈的详细区别和相关知识点: 1. **栈(Stack)**: - 栈是一种线性数据结构,具有后进先出(LIFO)的特点。 - 在C#和许多其他编程语言中,栈主要用来存储函数调用时的局部变量、函数参数和返回地址...

    The Run-time Heap and Stack

    在IT领域,尤其是在操作系统与编程语言的运行时环境中,“运行时堆和栈”(The Run-time Heap and Stack)是理解程序内存管理的核心概念。本文旨在深入解析这一主题,结合提供的部分文档内容,详细阐述堆和栈的区别...

    堆与栈的区别.txt

    ### 堆与栈的区别 #### 一、基础知识 在 C/C++ 编程语言中,内存管理是一项非常重要的技能。对于程序中的变量存储位置,通常可以分为几个部分:堆(Heap)、栈(Stack)、静态区(Static)以及代码区等。其中,堆...

    Delphi源码实例演示堆分配与栈分配的不同..rar

    首先,让我们来了解什么是栈(Stack)和堆(Heap)。栈是计算机内存中一个特殊区域,它按照后进先出(LIFO)的原则工作,主要用于存储程序运行时的临时变量。例如,函数调用时,函数参数、局部变量等都会被存储在栈...

    C语言 堆和栈的区别

    C语言中,堆(heap)和栈(stack)是两种不同的内存分配机制。堆是由malloc或new分配的内存,系统不释放,需要程序员自己释放,否则会出现“内存泄露(Memory Leak)”。栈是自动分配的内存,系统会自动释放。 堆的...

    给出的堆和栈的区别解释

    堆和栈的区别解释 堆和栈是计算机科学中两个基本概念,尤其在C/C++编程中.play a crucial role. 在这篇文章中,我们将详细解释堆和栈的区别,包括它们在内存中的存储方式、生命周期、优缺点等方面。 堆(Heap) ...

    堆和栈的区别(C/C++)

    堆和栈的区别(C/C++) 在 C/C++ 编程中,堆和栈是两个基本的内存分配机制。理解堆和栈的区别是非常重要的,因为它们对程序的性能和可靠性产生了很大的影响。 一、内存分配 在 C/C++ 中,程序占用的内存分为五个...

    讲述开发平台中,堆与栈的区别

    在IT开发领域,了解堆和栈的区别至关重要,因为它们是程序内存管理的基础。堆和栈是两种不同的内存区域,它们各自有不同的特点和用途。 首先,我们来看一下程序内存的分配。一个C或C++编译的程序会占用以下几种类型...

    C#中堆和栈的区别分析

    C#中堆和栈的区别分析 C# 中堆和栈的区别分析是理解 .NET 框架中内存管理的关键。堆和栈是两个基本元素,组成我们 C# 程序的运行环境。在这个知识点中,我们将详细介绍堆和栈的概念、类型变量、分配机制、生命周期...

    详细讲解堆和栈的区别

    在编程领域,尤其是对于C/C++程序员而言,堆(heap)和栈(stack)的概念是基础且至关重要的。两者在内存管理中扮演着不同的角色,掌握它们的区别对于理解程序运行时内存分配机制至关重要。 #### 一、基本概念 **栈**...

Global site tag (gtag.js) - Google Analytics