上面我们已经给出啦理论,这篇我们就上一篇的内容进行实际实战,加强对内存四区的理解,我们的代码区是存放函数体的二进制代码,所以他对我我们程序员来说是没有分析的必要的。常量区和全局区我们放在一块分析,把他们作为一种分析叫做全局区。我们要分析的就是栈区、堆区、全局区。我做实验的环境是VS2013的debug下的win32环境。请注意编译器的环境谢谢。
一、栈区分析
1.0 我们暂且不考虑栈区的开口向上还是向下,栈区的开口方向更加不同的编译器是不同的.
1.1 栈区作用: 由编译器自动分配释放,存放函数的参数值和局部变量的值。
1.2 根据栈区的作用我们可以知道我们在程序中所有的数据都是分配在栈区;至于具体分配的地址由编译器分配我们为了分析,我姑且自己编了个号。
1.3 栈区分配和释放有一个原则就是“先分配的后释放 后分配的先释放”,所有我们的num在最底下,weight在次地下。。
1.4 就拿main函数的num变量来说,我们的数据类型是int , int 数据类型占据4个字节,所以我们在栈区画出0x20000---0x20003做为num这个变量的内存空间,内存空间中保存数字10,
我们之所以分配这块内存空间,我们必然会使用这块内存空间,我们怎么使用那??前面说过了在C语言中可以使用两种方法操作这块内存块, 直接和间接。
直接操作是指: 我们使用变量名num来操作这块内存块,例如 往如家宾馆房间205送壶水,是指往房间205所代表的房间送壶水。请注意变量名和内存块的关系
间接操作是指聪明的你不难看出num所代表的内存块,占据0x20000--0x20003,我们可以通过这个地址来修改。至于怎么修改继续往下。
1.5 编译器会在调用函数前,将本函数的所有变量定义好,在去调用被调函数
1.6 内存分配的情况:
我们在main中分配的内存情况是:
num分配4个字节的内存空间 内存空间存放数字10 地址是0x20000---0x20003
weight分配8个字节的内存空间 内存空间存放数字20.1 地址是0x15000--0x15007
book分配1个字节的内存空间 内存空间存放字符 ‘a’ 地址是0x13000--0x13001
我们在print中分配的内存情况是:
sum分配4个字节的内存空间 内存空间中存放数字10 地址是0x10000--0x10007
指针p 分配4个字节的内存空间 内存空间中存放数字0x10000 地址是0x8000 -- 0x80007
1.7 我们在调用print函数的时候会类似于这样去分配内存,但是当我们调用完print后,我们可以知道栈区的内存空间是系统分配和释放的,系统认为你调用完了,print函数中分配在栈区的内存空间就没有用了,系统便会将这些内存空间的数据进行释放,我们在去使用已经释放的变量是错误的。
1.8 当我们调用晚print函数后,main也就算执行完了 ,操作系统会将book、 weight、 num这些变量自动的释放掉。
以上就是我对栈区分配内存和释放内存的理解,如果有什么不合适的地方还望大家指出,谢谢。接下来我们来分析全局区。