首先要说明的是字节顺序问题。由于历史原因,计算机的数据在内存中的存放方式有两种:
little endian,big endian。intel 的X86系列使用little endian体系,其他基于Risc的mips计算机
使用big endian体系。
little endian 指的是数据的高字节存在内存的高地址上,低位字节存放在内存的低地址上,big endian
和它相反。当编写跨平台和网络程序时应该注意字节顺序。
下面给出一般的c程序存储布局:
用户空间的程序使用低2G的虚拟内存,内核空间使用高2G
高地址 ——0x7FFFFFFF———
命令行参数和环境变量
——————————
栈空间,向下增长
___________________
堆空间,向上增长
———————————
未初始化的数据
———————————
已初始化的数据
———————————
正文段
低地址—0x00000000————
正文段:cpu执行的机器指令部分
初始化数据段:已初始化的全局变量
未初始化数据段:也成为bss段,存放没有初始化的全局变量
栈:自动变量,函数调用的返回地址,调用者环境变量,临时变量。
堆:动态分配的变量。
参考文献:
Advanced programming in the UNIX Environment , First Edition :by W.Richard Steves
Microsoft Windows Internals ,Fourth Edition :by Mark E. Russinovich, David A. Solomon