C/C++内存区域分析

来源:互联网 发布:yy协议软件手机版 编辑:程序博客网 时间:2024/06/01 08:57

这里写图片描述
操作系统核心占用了3G到4G之间的内存区域,这段区域的内存是不可操作的,当我的程序访问到这块内存中时,程序就会报错。0G到3G之间的内存空间由栈存储区、共享库/动态库、堆存储区、BSS区、DATA区、RO.DATA区、TEXT区占用。栈存储区一般存储成员变量,自动释放回收;linux中的共享库,windows中的动态库,比如libc,这段区域是可读不可写的;堆存储区,C语言中通过malloc函数分配空间的变量存储,C++中通过new关键字修饰的变量存储的区域;BSS区存储为初始化的全局变量;DATA区存储已初始化的全局变量;RO.DATA区存放只读数据;TEXT区存放机器二进制指令,就是当我们的代码被编译成二进制指令之后就会存放在TEXT区中;
这里写图片描述

如图所示,打印出变量a的地址是:0x804a024,是个低地址,a是已初始化的全局变量,保存在DATA区中;打印出b变量的地址是:0x804a02c,也是个低地址,b是未初始化的全局变量,保存在BSS区中,DATA区和BSS区是紧挨着的,两个地址值很接近;打印变量c的地址是:0xffc725ac,是个高地址,c是局部变量,所以存储在栈存储区中,栈存储区紧挨着3G,所以地址为高地址;str1是个指针变量,显示打印str1字符串的首地址为:0x80485e0,字符串储存在RO.DATA区中,为只读数据区,字符串是个常量;&str1打印的是指针的地址为:0xffc725b0,指针变量str1存储在栈存储区中;str2打印的是str2字符数组的地址,字符数组的地址打印出来也就是字符数组的首地址,为0xffc725b6,它是一个栈存储区的地址;&str2打印的是字符数组的首地址,也为0xffc725b6。

原创粉丝点击