关于堆栈的讲解(一)

1、 堆和栈基本概念: (来自网上)

简单的来讲堆(heap)上分配的内存,系统不释放,而且是动态分配的。

栈(stack)上分配的内存系统会自动释放,它是静态分配的。栈的分配是从内存的高地址向低地址分配的,而堆则相反(好像这里说错了,堆本来就是 链式存储,哪里来的高到低,低到高)。

由malloc或new分配的内存都是从heap(堆)上分配的内存,从heap(堆)上分配的内存必须有程序员自己释放,用free来释放,否则这块内存会一直被占用而得不到释放,就出现了“内存泄露(Memory Leak)”。

这样会造成系统的可分配内存的越来越少,导致系统崩溃。(可以写恶意程序,让系统崩溃吧^*^)

2、预备知识

一个由c/C++编译的程序占用的内存分为以下几个部分

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

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

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

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

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

1、

#include<stdio.h>
#include<string.h>
#include<malloc.h>

int a = 0; //全局初始化区

char *p1; //全局未初始化区 0x0000 0000

main()

{

int b=3; // 栈       

char s[] = "abc "; //栈地址 0x12ff74 abc 入栈,调试窗口下 ESP = 0012FF20,为什么不是 0x12ff74-4= 0x12ff70 ? why

char *p2; //栈 P2地址是 0x12ff70,说明是对的 

char *p3 = "123456 "; //123456/0在常量区,p3在栈上,地址是 0x12ff6c,但是 123456 是放在常量区的   

static int c =0; //全局(静态)初始化区   

p1 = (char *)malloc(10); // 放在了 堆区    

p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。    

strcpy(p1, "123456 "); //123456/0放在常量区,编译器可能会将它与p3所指向的 "123456 "优化成一个地方。    

}

好难,自己理解吧!!!!

常量区   堆区  全局静态区              
                       
      c    0x004225a0                
                   p3  0x0012ff6c    
    p1  0x00431cb0 存放 123456 开始的 &p1 0x4225a4           它指向的 123456  在常量区  
                       
                       
    p2  0x00431c70              p2   0x0012ff70    
0x0041f01c 123456                    
                       
                       
                  s    0x0012ff74  61  a  
                    62  b  
                    63  c   
                    20  空格  
                    00  ‘\0‘   
                      cc  
                    cc  
                    cc  
                    cc  
                  b     0x0012ff7c 03  
                  应为是 int 占 四个字节 00   
                    00   
                    00   
时间: 2024-07-30 10:16:54

关于堆栈的讲解(一)的相关文章

关于堆栈的讲解

一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) - 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(static)-,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未

C++语言堆栈的详细讲解

本文主要向大家介绍了C++语言堆栈的详细讲解,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助. 一.预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(stati

C#堆栈讲解

1:栈就是堆栈,因为堆和堆栈这样说太拗口了,搞得像绕口令,所以有些时候就把堆栈简称为栈.堆和栈,你看这又多舒服.但无论什么时候,堆栈都不等于堆和栈,必须说,堆和栈或者堆和堆栈. 2:值类型变量和引用类型变量是保存在栈里面的.而值类型变量保存值类型实例的值,引用类型变量保存引用类型实例的引用. 对象的引用是保存的指向堆中的地址的指针,堆中保存的才是对象实例 3:平时一个对象本身就包含有值类型和对象的实例,这就要分清字段和变量的概念.一般来说可以这样讲,在类里面声明的,是字段,在方法里面声明的,是变

[转载]C#堆栈讲解

1:栈就是堆栈,因为堆和堆栈这样说太拗口了,搞得像绕口令,所以有些时候就把堆栈简称为栈.堆和栈,你看这又多舒服.但无论什么时候,堆栈都不等于堆和栈,必须说,堆和栈或者堆和堆栈. 2:值类型变量和引用类型变量是保存在栈里面的.而值类型变量保存值类型实例的值,引用类型变量保存引用类型实例的引用. 对象的引用是保存的指向堆中的地址的指针,堆中保存的才是对象实例 3:平时一个对象本身就包含有值类型和对象的实例,这就要分清字段和变量的概念.一般来说可以这样讲,在类里面声明的,是字段,在方法里面声明的,是变

在Linux与Windows上获取当前堆栈信息

在编写稳定可靠的软件服务时经常用到输出堆栈信息,以便用户/开发者获取准确的运行信息.常用在日志输出,错误报告,异常检测. 在Linux有比较简便的函数获取堆栈信息: #include <stdio.h> #include <execinfo.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> void handler(int sig) { void *array[5]; s

C/C++堆栈指引

[转载]C/C++堆栈指引 转载:http://www.cnblogs.com/Binhua-Liu/archive/2010/08/24/1803095.html 前言 我们经常会讨论这样的问题:什么时候数据存储在堆栈(Stack)中,什么时候数据存储在堆(Heap)中.我们知道,局部变量是存储在堆栈中的:debug时,查看堆栈可以知道函数的调用顺序:函数调用时传递参数,事实上是把参数压入堆栈,听起来,堆栈象一个大杂烩.那么,堆栈(Stack)到底是如何工作的呢? 本文将详解C/C++堆栈的工

性能测试进阶指南——基础篇一(系统资源的讲解)

本文旨在帮助测试人员对性能测试常用指标做一个简单的讲解,主要包括CPU.内存.磁盘和网络带宽等系统资源,本文仅仅局限于Linux系统,Windows Server系统暂不做考虑. 一.系统资源的分析 Linux下的系统资源主要记录在内核文件/proc中,下面几乎记录了Linux所有的系统信息. 1.CPU 1.1 CPU的文件系统 CPU的基本信息在目录cpuinfo下可以查看,基于不同指令集(ISA)的CPU产生的/proc/cpuinfo文件不一样,基于X86指令集CPU的/proc/cpu

使用TCmalloc的堆栈检查

使用TCMalloc的堆栈检查 Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:October 15th, 2014 在前一篇译文<TCMalloc:线程缓冲的Malloc>详细讲解了TCMalloc的工作原理和特点,今天翻译<heap-checking using tcmalloc>,了解Tcmalloc堆栈检查. 一.自动的内存泄漏检查 这篇技术文档描述了如何使用

C# 深入理解堆栈、堆在内存中的实现

尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(GarbageCollection),但是我们还是应该了解它们,以优化我们的应用程序.同时,还需要具备一些基础的内存管理工作机制的知识,这样能够有助于解释我们日常程序编写中的变量的行为.在本文中我将讲解栈和堆的基本知识,变量类型以及为什么一些变量能够按照它们自己的方式工作. 在.NET framework环境下,当我们的代码执行时,内存中有两个地方用来存储这些代码.假如你不曾了解,那就让我来给你介绍栈(Stack)和堆(He