C语言变量存储区域 进程内存布局
2015-08-28 15:54
555 查看
更加详细的进程内存布局可以查看 http://blog.csdn.net/yusiguyuan/article/details/45155035
一个进程的内存通常分为几个大区:共享存储区、栈区、堆区、全局静态区、文字常量区,此外还有程序代码区,其中,全局静态区又可以分为全局非初始化区和全局初始化区,从具体程序中来看,初始化和非初始化的全局OR全局静态OR局部静态变量,其地址相差并不远,但还是可以看到明显的非初始化和初始化有分隔。
关于初始化和非初始化的问题,我们一般认为全局变量、static变量在不显示初始化时都会默认初始化,这是肯定的,而在gcc测试时,局部变量未显示初始化,也会自动默认初始化为0,可能是编译器已经做了这方面的优化。
共享存储区是在测试IPC通信shmget发现的,在我的机器上,其地址与最高的栈区相差甚远,还在很高的地址上。
栈区存储局部非static变量甚至局部const变量,局部static变量不在这里存储。
堆区用于存储用malloc等动态申请了空间的变量。
全局静态区存储全局变量、static变量不管局部还是全局,全局const变量未显示初始化则会存放在这个区中,不会存放在常量区。这个区域还明显分开了初始化的和未初始化的两块区域。
文字常量区存放初始化的全局const、字符串字面量。
一个进程的内存通常分为几个大区:共享存储区、栈区、堆区、全局静态区、文字常量区,此外还有程序代码区,其中,全局静态区又可以分为全局非初始化区和全局初始化区,从具体程序中来看,初始化和非初始化的全局OR全局静态OR局部静态变量,其地址相差并不远,但还是可以看到明显的非初始化和初始化有分隔。
关于初始化和非初始化的问题,我们一般认为全局变量、static变量在不显示初始化时都会默认初始化,这是肯定的,而在gcc测试时,局部变量未显示初始化,也会自动默认初始化为0,可能是编译器已经做了这方面的优化。
共享存储区是在测试IPC通信shmget发现的,在我的机器上,其地址与最高的栈区相差甚远,还在很高的地址上。
栈区存储局部非static变量甚至局部const变量,局部static变量不在这里存储。
堆区用于存储用malloc等动态申请了空间的变量。
全局静态区存储全局变量、static变量不管局部还是全局,全局const变量未显示初始化则会存放在这个区中,不会存放在常量区。这个区域还明显分开了初始化的和未初始化的两块区域。
文字常量区存放初始化的全局const、字符串字面量。
相关文章推荐
- LeetCode-Ugly Number II-解题报告
- fprintf 函数详解
- 排洪河道规划问题(C语言建模)
- C,C++ 动态字符串的实现
- C语言中最常用标准库函数
- c++中冒号(:)和双冒号(::)的用法
- error C2440 “static_cast” 无法从“void (__thiscall CPppView )(void)...
- c++中静态数据成员与常量的初始化
- C++11新特性之名词解释
- 【C Primer Plus】【课后习题】第二章C语言概述
- C++:宏替换的误区
- 二叉搜索树
- C语言的那些个关键字们
- Qt Creator编译器设置:添加C++11支持
- 如何评价 C++11 的右值引用(Rvalue reference)特性
- C++ 如何初始化静态类成员
- C++ 图片自适应 picture control 控件大小 不失真显示
- 0-1背包问题:C++
- 用C++实现一元多项式的四则运算包括数据的文件导入与导出
- C++_TCHAR字符串在UNICODE环境的控制台下输出