- 论坛徽章:
- 0
|
临时变量,static,malloc分别申请在哪里?
原帖由 "albcamus" 发表:
商榷一下。我觉得这样:
1,在所有函数之外的变量,在静态区,即data段;
2,所有static,在data中;
3,函数中的自动变量,在栈,即stack中;
4,malloc来的,在堆,即heap中。
怎样定义“动态”二字?这是..........
补充一下, 与大家讨论.
如ayazero所说, OS中描述的Process Image段和CPU芯片用的段寻址并不是同一概念. 这里的段是一块连续地址, 并有特定的属性. 比如在LINUX上,
>;cat /proc/pid/maps
address perms offset dev inode pathname
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
08056000-08058000 rwxp 0000d000 03:0c64593 /usr/sbin/gpm
08058000-0805b000 rw-p 00000000 00:00 0
这里显示了程序gpm的三段内存. 第一段是TEXT, 第二段是DATA, 第三段是HEAP. 还有STACK段没有显示.
可以看出, TEXT段可读/执行, 但不能写; DATA段可读/写/执行; HEAP可读/写, 但不能执行. STACK应可读/写, 不知能否执行. 谁可以证实一下.
TEXT和DATA段有磁盘文件支持. 文件inode是64593, 文件路径是/usr/sbin/gpm.(也可以, find /usr -inum 64593). HEAP段还没有磁盘文件支持, 但是当有heap page被page out后, 应该有swap磁盘文件支持. 谁可以证实一下?
全局变量与static变量都在DATA段. 它们的生命与进程一样长短. 而且地址相对MODEUL是不变的. 当然其绝顶地址因MODULE每次装载地址不同而不同. static变量对COMPILER来说有特定的SCOPE.不管是函数,文件,还是类SCOPE, 程序只能在SCOPE之内读写static变量. 这是由COMPILER强制的. 但是因为static变量在DATA段,只要我知道它的地址,我可以直接读写该地址,从而在SCOPE之外读写static变量. 这也是DEBUGGER能在调试进程的任何时候读写static变量和全局变量.
malloc得到的变量自然在HEAP段. 临时变量在STACK段. 它们基本上是维一能伸缩的段. HEAP向上增, STACK向下增. 有意思的是多个HEAP. 比如mmap创建的段.不同的是, 这些段大都不能伸缩(WIN_TEL是例外). 且与主HEAP不连续, 否则主HEAP没法延伸. |
|