码迷,mamicode.com
首页 > 其他好文 > 详细

关于堆栈的讲解(一)

时间:2015-10-17 12:01:38      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:

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   

关于堆栈的讲解(一)

标签:

原文地址:http://www.cnblogs.com/shengruxiahua/p/4887123.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!