189 8069 5689

程序在内存的存储-创新互联

一.概述

创新互联专注于扶绥企业网站建设,成都响应式网站建设,商城网站建设。扶绥网站建设公司,为扶绥等地区提供建站服务。全流程按需规划网站,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务

在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://cdxtjz.cn/article/jsgjh.html

其他资讯