程序在内存的存储-创新互联
一.概述
创新互联专注于扶绥企业网站建设,成都响应式网站建设,商城网站建设。扶绥网站建设公司,为扶绥等地区提供建站服务。全流程按需规划网站,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务在c语言的编程程序中,代码在内存中执行时,程序所占用的内存分为四个区域即全局区,栈区,堆区,代码区。并且每一个程序都有他唯一的四个区域。
二.
1.全局区
全局区存放 全局变量,静态变量(static),常量(包含字符串常量,const修饰的全局变量),并且在程序结束后由系统释放。
2.栈区
存放局部变量,形式参数,栈区数据在函数结束后自动释放,即开辟的数据由编译器自动释放
3.堆区
由程序员自己分配释放,若不释放,程序结束后被操作系统回收
eg.在c++中主要用new在堆区中开辟内存
4.代码区
存放函数体的二进制代码
三.例子
#includeusing namespace std;
int g_a = 10;
int g_b = 10;
static int s_g_a = 10;//静态全局变量a
static int s_g_b = 10;//静态全局变量b
const int c_g_a = 10;//const修饰的全局变量a,也是全局常量
const int c_g_b = 10;//const修饰的全局变量b,也是全局常量
int main()//(写在函数体main内的都叫局部变量而没有写在main函数体中的变量是全局变量)
{
//这个就是局部变量,写在main函数体中
int a = 10;
int b = 10;//不在全局区中,有局部修饰的常量或变量都是不在全局区的
cout<< "局部变量a的十进制地址为:"<< (int)&a<< endl;
cout<< "局部变量b的十进制地址为:"<< (int)&b<< endl;
cout<< "***************//^\\***************"<< endl;
cout<< "全局变量g_a的十进制地址为:"<< (int)&g_a<< endl;
cout<< "全局变量g_b的十进制地址为:"<< (int)&g_b<< endl;
cout<< "***************//^\\***************"<< endl;
//静态局部变量
static int s_a = 10;
static int s_b = 10;
cout<< "静态局部变量s_a的地址为:"<< (int)&s_a<< endl;
cout<< "静态局部变量s_b的地址为:"<< (int)&s_b<< endl;
//输出静态全局变量
cout<< "静态全局变量s_g_a的地址为:"<< (int)&s_g_a<< endl;
cout<< "静态全局变量s_g_b的地址为:"<< (int)&s_g_b<< endl;
//可以看出静态变量和全局变量的存放地址十分相近
//字符串常量
cout<< "***************//^\\***************"<< endl;
cout<< "字符串常量的地址为:"<< (int)&"welcome to my blog"<< endl;
//字符串常量的地址也跟静态常量和全局变量的地址相近,说明它们是存放在一个区域的
//其它常量,const修饰,局部常量和全局常量
cout<< "***************//^\\***************"<< endl;
const int c_a = 10;//const修饰的局部变量a,也是局部常量
const int c_b = 10;//const修饰的局部变量b,也是局部常量
cout<< "const修饰的局部变量a:"<< (int)&c_a<< endl;//不在全局区中,有局部修饰的常量或变量都是不在全局区的
cout<< "const修饰的局部变量b:"<< (int)&c_b<< endl;//不在全局区中,有局部修饰的常量或变量都是不在全局区的
cout<< "const修饰的全局变量a:"<< (int)&c_g_a<< endl;
cout<< "const修饰的全局变量b:"<< (int)&c_g_b<< endl;
system("pause");
return 0;
}
四.
从低地址到高地址,可分为下面几段:
预留内存地址(操作系统维护的内存地址,不可访问)
程序代码区(只读,存代码和一些其他的东西);
data段(存初始化的全局变量和static变量,另外还有文字常量区,常量字符串就是放在这里,程序结束后有系统释放);
bss段(Block Started by Symbol segment)存未初始化的全局变量和static变量, 通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了
堆(由低地址向高地址增长,一般new和malloc分配,由程序员分配释放);
共享库文件(调用的库文件,位于堆和栈之间);
栈(由高地址向低地址增长,和堆的增长方式相对,对不同的OS来说,栈的初始大小有规定,可以修改,目前默认一般为2M,由编译器自动分配释放);
再上面存的都是操作系统和内核调用的一些内存地址。
五.参考
(65条消息) C++代码区和全局区详解_洛里斯的博客-博客_c++代码区
https://blog.csdn.net/fguihbfg/article/details/86492162
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享文章:程序在内存的存储-创新互联
本文来源:http://pwwzsj.com/article/jsgjh.html