标签:
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