一直以来对堆与栈的理解是有点模糊。
起初只是知道栈空间是连续的;因为这种特性,使栈的操作与使用比较简单,基本操作就是指针上下移动就行了。而堆的空间分布可以是不连续的,因为这个原因会带来操作上的一些繁琐,比如进行搜索时会出现不必要的步骤,但在另一方面来说提高了灵活性。
但是对于程序来说,数据应该在什么情况下分配到栈空间,什么情况下分配到堆空间呢?
应该可以这样理解:
1.没有引用类型的值类型会在栈空间里分配,比如struct,局部变量的int等。
2.至于包含了引用类型的:引用类型可以分成两部分,一部分是它的"引用",分配在栈空间里;一部分是实际内容,分配在堆空间里。
应该可以这样举例,'引用'就是一条街的地址名,通过这个地址名就可以找到这条街。那么这地址名是放在栈里,真实的街道则是在堆空间里了。
以上是个人的一些粗浅理解。
写到这里,有点纠结,感觉这方面还是有很多知识不够理解。不知道知道了这些会有多大用处,但知道堆和栈的一些知识还是有益的吧。
以下是参考资料,仅作读书笔记:
一般认为在c中分为这几个存储区:
1. 栈 --有编译器自动分配释放
2. 堆 -- 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3. 全局区(静态区) -- 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。
4. 另外还有一个专门放常量的地方。程序结束释放
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。 比如:
代码:
//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"优化成一个地方
}
分享到:
相关推荐
### 堆与栈的区别(非常经典) #### 一、预备知识—程序的内存分配 在探讨堆与栈的区别之前,我们首先...通过以上的分析,我们可以清楚地了解到堆与栈之间的主要区别,这对于理解和编写高效的程序是非常有帮助的。
### 深入理解堆与栈:堆与栈的区别 #### 一、基本概念与区别 在编程领域,特别是对于Java这种广泛使用的语言而言,理解内存管理中的“堆”与“栈”的概念及其区别至关重要。这不仅有助于我们更高效地编写代码,还...
在计算机科学领域,内存管理是实现程序高效运行的关键技术之一,而其中的堆(Heap)与栈(Stack)是两种核心的内存分配方式。本文将深入探讨这两种内存区域的分配区别,以及它们在程序中的作用机制,帮助读者理解C/...
以下是关于堆和栈的详细区别和相关知识点: 1. **栈(Stack)**: - 栈是一种线性数据结构,具有后进先出(LIFO)的特点。 - 在C#和许多其他编程语言中,栈主要用来存储函数调用时的局部变量、函数参数和返回地址...
在C语言的学习过程中,理解堆(Heap)与栈(Stack)的概念及其区别是非常重要的。本文将详细介绍这两种数据结构的特点、用途以及它们之间的主要区别,帮助初学者更好地掌握C语言中的内存管理技巧。 #### 一、栈...
堆和栈是计算机内存管理中的两个...总的来说,理解堆和栈的区别和特性,对于优化代码、防止内存泄漏、提升程序性能至关重要。在编程实践中,应根据具体需求选择合适的数据存储方式,以实现更高效、更稳定的程序设计。
理解堆和栈的区别是每一个程序员的基础知识,尤其在面试中常常被问及。 首先,栈(Stack)和堆(Heap)是程序运行时内存的两个主要分区。栈区由编译器自动分配和释放,主要用于存放函数参数、局部变量等。栈的操作...
### 堆与栈的区别 #### 一、基础知识 在 C/C++ 编程语言中,内存管理是一项非常重要的技能。对于程序中的变量存储位置,通常可以分为几个部分:堆(Heap)、栈(Stack)、静态区(Static)以及代码区等。其中,堆...
堆和栈是计算机中两个重要的内存管理机制,它们之间的区别对于程序员来说非常重要。本文将详细介绍堆和栈的概念、特点、申请方式、申请后系统的响应、申请大小的限制、申请效率的比较、存储内容和存取效率的比较。 ...
在计算机科学与软件工程领域,堆(heap)和栈(stack)是两种极为重要的内存管理机制。这两种内存分配方式各自具有独特的特点和用途,对于理解程序运行时内存管理至关重要。 #### 二、堆与栈的基本概念 ##### 2.1 ...
在编程世界中,理解和掌握常量、堆与栈、数组与指针的区别是至关重要的基础知识。这些概念构成了程序设计的基础,对于优化代码性能、避免内存泄漏等问题有着直接的影响。下面,我们将逐一深入探讨这些主题。 首先,...
### Java中堆内存与栈内存分配浅析 #### 一、引言 在Java编程语言中,内存管理是一项至关重要的技术。程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的...
总之,理解和掌握堆分配与栈分配是Delphi开发者必备的基础知识。在编写程序时,根据需求合理选择内存分配方式,不仅能提高程序效率,还能避免许多潜在的问题,如内存泄漏和栈溢出。通过这个源码实例,你可以亲手实践...
C# 中堆和栈的区别分析是理解 .NET 框架中内存管理的关键。堆和栈是两个基本元素,组成我们 C# 程序的运行环境。在这个知识点中,我们将详细介绍堆和栈的概念、类型变量、分配机制、生命周期和垃圾回收机制等。 一...
"关于堆和栈的那些事" 在计算机科学中,堆(Heap)和栈(Stack)是两种基本的内存分配机制。堆是为动态分配预留的内存空间,而栈是为执行线程留出的内存空间。本文将详细讲解堆和栈的概念、特点、差异和应用场景。 ...
#### 四、堆与栈的区别 1. **生命周期**:栈内存中的变量在其定义的方法执行结束后就会被销毁;而堆内存中的对象直到没有引用指向它才会被垃圾回收。 2. **内存分配**:栈内存分配和释放速度快,而堆内存的分配涉及...
堆和栈的区别解释 堆和栈是计算机科学中两个基本概念,尤其在C/C++编程中.play ...堆和栈是C/C++编程中两个基本概念,理解它们的区别和使用场景是非常重要的。在编程中,正确地使用堆和栈可以提高程序的效率和可靠性。
本文将深入探讨堆和栈的区别,帮助读者理解这两种数据结构的工作原理及其在编程中的应用。 首先,我们要了解堆(Heap)和栈(Stack)的基本概念: 1. **栈(Stack)**: 栈是一种后进先出(Last In First Out, ...
关于Java栈与堆的深入解析 Java作为一种广泛使用的编程语言,其内存管理机制是学习者必须掌握的核心概念之一。在Java中,栈(Stack)与堆(Heap)是用于存储数据的主要区域,它们各自承担着不同的职责,对于理解...
### 操作系统中堆和栈的区别 #### 一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存被...通过以上分析,我们可以清楚地了解到在操作系统中堆和栈的区别,这对于理解和编写高效的 C/C++ 程序至关重要。