C/C++程序分布

来源:互联网 发布:大连网络咨询男科 编辑:程序博客网 时间:2024/05/16 13:59

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

栈区:由编译器自动分配释放,存放局部变量(不包括静态),参数,返回值。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场

堆区堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc,new/free,delete等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张)/释放的内存从堆中被剔除(堆被缩减)

BBS区:属于静态分配内存,通常是指用来存放程序中未初始化全局变量的一块内存区域

数据段数据段属于静态内存分配。 数据段(data segment)通常是指用来存放程序中 已初始化  全局变量 的一块内存区域,和字符常量

代码段:代码段(code segment/text segment)通常是指用来存放 程序执行代码 的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于 只读 , 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些 只读的常数变量 ,例如字符串常量等。程序段为程序代码在内存中的映射.一个程序可以在内存中多有个副本.

关于const常量可以参看http://blog.csdn.net/lixiang100824/article/details/7473890

1.对const常量取地址时,编译器会进行内存分配,并将常量转换为立即数存入内存,而不是存入记录在常量表中的地址

2.在使用常量时,编译器回到常量表中查询对应的常量,并将其替换,这部分没有涉及内存分配,也跟曾经创建的常量的内存地址无关。


///内存分布int g1 = 0, g2  , g3 = 0;int max(int i){int m1 = 0, m2, m3 = 0, *p_max;static int  n1_max = 0, n2_max, n3_max = 0;p_max = (int*)malloc(10);printf("打印max程序地址\n");printf("in max: 0x%0x\n\n", max);printf("打印max传入参数地址\n");printf("in max: 0x%0x\n\n", &i);printf("打印max函数中静态变量地址\n");printf("0x%0x\n", &n1_max); //打印各本地变量的内存地址printf("0x%0x\n", &n2_max);printf("0x%0x\n\n", &n3_max);printf("打印max函数中局部变量地址\n");printf("0x%0x\n", &m1); //打印各本地变量的内存地址printf("0x%0x\n", &m2);printf("0x%0x\n\n", &m3);printf("打印max函数中malloc分配地址\n");printf("0x%0x\n\n", p_max); //打印各本地变量的内存地址if (i) return 1;else return 0;}int main(int argc, char **argv){static int s1 = 0, s2, s3 = 0;int v1 = 0, v2, v3 = 0;int *p;p = (int*)malloc(10);printf("打印各全局变量(已初始化)的内存地址\n");printf("0x%0x\n", &g1); //打印各全局变量的内存地址printf("0x%0x\n", &g2);printf("0x%0x\n\n", &g3);printf("======================\n");printf("打印程序初始程序main地址\n");printf("main: 0x%0x\n\n", main);printf("打印主参地址\n");printf("argv: 0x%0x\n\n", argv);printf("打印各静态变量的内存地址\n");printf("0x%0x\n", &s1); //打印各静态变量的内存地址printf("0x%0x\n", &s2);printf("0x%0x\n\n", &s3);printf("打印各局部变量的内存地址\n");printf("0x%0x\n", &v1); //打印各本地变量的内存地址printf("0x%0x\n", &v2);printf("0x%0x\n\n", &v3);printf("打印malloc分配的堆地址\n");printf("malloc: 0x%0x\n\n", p);printf("======================\n");max(v1);printf("======================\n");printf("打印子函数起始地址\n");printf("max: 0x%0x\n\n", max);return 0;}

理论上是那样,但windows8.1下跑,好像不对,下面是两个完全不同的结果


0 0
原创粉丝点击