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
- C程序内存分布
- c程序内存分布
- C程序存储空间分布
- c程序内存分布
- C/C++程序分布
- C/C++ 程序内存分布
- C语言程序内存分布
- C/C++程序内存分布
- c程序的内存分布
- C程序的内存分布
- c语言程序内存分布
- Objective-C 程序内存分布
- C程序运行时内存分布
- C/C++程序的内存分布
- c/c++程序在内存中的分布
- C程序为例内存分布详解
- C程序为例内存分布详解
- c/c++程序在内存中的分布
- Flip Game
- 第一次解题报告
- hdu 1178 shui
- 前段开发——推荐书籍
- POJ 2247 Humble Numbers
- C/C++程序分布
- 理解GRUB2工作原理及配置选项与方法
- 读书管理(1) --《精益求精》
- apache虚拟主机安装注意事项
- C_1003
- C++拾遗之1---初步体验项目4-求四个数的最大值
- HTTP请求(post与get)和响应
- 通过键盘输入100以内正整数的加、减运算式,算出结果
- 计算机能用二进制准确表示哪些十进制数?