2.堆.栈和内存映射详解


1.每个线程都有自己专属的栈(stack),先进后出(LIFO)

2.栈的最大尺寸固定,超出则引起栈溢出

3.变量离开作用范围后,栈上的数据会自动释放

4.堆上内存必须手动释放(C/C++)除非语言执行环境支持GC

5.栈还是堆?

--明确知道数据占用多少内存

--数据很小

--大量内存

--不确定需要多少内存



 

 举个例子

值得注意的是list_buf这个指针变量是在栈区,二list_buf这个指针指向的内存在堆区,还有函数的参数也是在栈区,而且是从右往左入栈

详细过程如下,值得注意的是,函数的参数如果是引用传递,先在栈区创建一个变量,占四个自己,但指向了一个堆区的内存.

 

静态区的值是一直不动的,而栈区的值是不断变化的.

 下面我们在linux下演示一下:

 第一步:vi a.c创建一个c语言程序

esc  :x保存,注意是小写x

新打开一个终端看看我们写的代码

然后我们看看运行的情况

我们往下拉:

好,我们看到了我们之前写的程序,看到之后我们再进入进程

我们再来看看maps

 1 cgw@cgw-virtual-machine:/proc/66050$ cat maps
 2 00400000-00401000 r-xp 00000000 08:01 430038                             /home/cgw/桌面/1/a
 3 00600000-00601000 r--p 00000000 08:01 430038                             /home/cgw/桌面/1/a
 4 00601000-00602000 rw-p 00001000 08:01 430038                             /home/cgw/桌面/1/a
 5 0194d000-0196e000 rw-p 00000000 00:00 0                                  [heap]
 6 7efd7cfea000-7efd7d1aa000 r-xp(r:读 x:执行 p:private地址) 00000000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
 7 7efd7d1aa000-7efd7d3aa000 ---p 001c0000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
 8 7efd7d3aa000-7efd7d3ae000 r--p 001c0000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
 9 7efd7d3ae000-7efd7d3b0000 rw-p 001c4000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
10 7efd7d3b0000-7efd7d3b4000 rw-p 00000000 00:00 0 
11 7efd7d3b4000-7efd7d3da000 r-xp 00000000 08:01 661197                     /lib/x86_64-linux-gnu/ld-2.23.so
12 7efd7d5bb000-7efd7d5be000 rw-p 00000000 00:00 0 
13 7efd7d5d7000-7efd7d5d9000 rw-p 00000000 00:00 0 
14 7efd7d5d9000-7efd7d5da000 r--p 00025000 08:01 661197                     /lib/x86_64-linux-gnu/ld-2.23.so
15 7efd7d5da000-7efd7d5db000 rw-p 00026000 08:01 661197                     /lib/x86_64-linux-gnu/ld-2.23.so //这些是我们程序需要的库文件
16 7efd7d5db000-7efd7d5dc000 rw-p 00000000 00:00 0 
17 7ffc5ed55000-7ffc5ed76000 rw-p 00000000 00:00 0                          [stack]我们可以算出地址大小为:8124字节 也就是8kb
18 7ffc5edea000-7ffc5edec000 r--p 00000000 00:00 0                          [vvar]
19 7ffc5edec000-7ffc5edee000 r-xp 00000000 00:00 0                          [vdso]
20 ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

下面我们看看堆的内存,首先修改代码

采用以下指令看内存:

查看代码指令:cat a.c

查看进程:ps -u cgw

找到对应进程号后: cd /proc

我这里对应的是66050,所以我们cd 66050 进入该进程

我们再ls查看一下

然后cat maps 查看内存

 1 cgw@cgw-virtual-machine:/proc/66234$ cat maps
 2 00400000-00401000 r-xp 00000000 08:01 398616                             /home/cgw/桌面/1/a
 3 00600000-00601000 r--p 00000000 08:01 398616                             /home/cgw/桌面/1/a
 4 00601000-00602000 rw-p 00001000 08:01 398616                             /home/cgw/桌面/1/a
 5 0117d000-0119e000 rw-p 00000000 00:00 0                                  [heap]修改后的代码我们看到这里,是堆区,可读可写,为什么我们分配1k会分配这么多呢?因为最小会给你这么多,申请一个字节也是这么多内存
 6 7f4a849e9000-7f4a84ba9000 r-xp 00000000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
 7 7f4a84ba9000-7f4a84da9000 ---p 001c0000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
 8 7f4a84da9000-7f4a84dad000 r--p 001c0000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
 9 7f4a84dad000-7f4a84daf000 rw-p 001c4000 08:01 661234                     /lib/x86_64-linux-gnu/libc-2.23.so
10 7f4a84daf000-7f4a84db3000 rw-p 00000000 00:00 0 
11 7f4a84db3000-7f4a84dd9000 r-xp 00000000 08:01 661197                     /lib/x86_64-linux-gnu/ld-2.23.so
12 7f4a84fba000-7f4a84fbd000 rw-p 00000000 00:00 0 
13 7f4a84fd6000-7f4a84fd8000 rw-p 00000000 00:00 0 
14 7f4a84fd8000-7f4a84fd9000 r--p 00025000 08:01 661197                     /lib/x86_64-linux-gnu/ld-2.23.so
15 7f4a84fd9000-7f4a84fda000 rw-p 00026000 08:01 661197                     /lib/x86_64-linux-gnu/ld-2.23.so
16 7f4a84fda000-7f4a84fdb000 rw-p 00000000 00:00 0 
17 7fff5dd57000-7fff5dd78000 rw-p 00000000 00:00 0                          [stack]
18 7fff5dd8a000-7fff5dd8c000 r--p 00000000 00:00 0                          [vvar]
19 7fff5dd8c000-7fff5dd8e000 r-xp 00000000 00:00 0                          [vdso]
20 ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
原文地址:https://www.cnblogs.com/xiaochi/p/7992245.html