C/C++程序运行时的内存分区演示(全局区、堆区、栈区)

1、一个由C/C++编译的程序在运行时,所占用的内存分为以下4个部分:

  • 代码区:存放函数体的二进制代码,由操作系统进行管理的。

  • 栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值、局部常量等。

  • 堆区(heap):由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。

  • 全局区(static):存放全局变量、全部静态变量(局部和全局)以及全局常量。

2、写一个简单的代码,大致演示 栈区 、堆区、全局区的内存区域:

3、C++代码:

/*

C/C++程序运行时的内存分区

一个由C/C++编译的程序在运行时,所占用的内存分为以下4个部分:

代码区:存放函数体的二进制代码,由操作系统进行管理的。
栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值、局部常量等。
堆区(heap):由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收。
全局区(static):存放全局变量、全部静态变量(局部和全局)以及全局常量。

*/

/*写一个简单的代码,大致演示 栈区 、堆区、全局区的内存区域*/

#include<iostream>
#include<string>
using namespace std;

//*******************************//
//定义堆、栈、全局变量           //
//*******************************//



//(堆区)程序员自开辟内存地址
int * dui_new = new int(20);
int * dui_malloc = (int *)malloc(10); //在堆区申请了10个字节空间


//(栈区)函数fun_p的参数
void fun_p(int fun_p)
{
	fun_p++;
	cout << "函数fun_p的参数地址为: " << (int)&fun_p << endl;
}


//(全局区)全局变量,不是栈
int g_n_s = 10;//定义一个全局变量(不是栈里变量)
static int s_a = 10;//定义一个全局静态变量


//(全局区)全局常量
#define g_c 10
const int g_c2 = g_c;


int main(void)
{


//(栈区)局部变量
	int local_a = 10;//定义一个局部变量,也就是栈



//(全局区)局部静态变量
	static int s_l_a = 10;//定义一个局部静态变量


//(栈区)局部常量
	const int g_c3 = g_c;


//*******************************//
//答应堆、栈、全局变量的地址     //
//*******************************//

	cout << "*******************************************************************************" << endl;
	cout << "*1、栈区(stack)--由编译器自动分配释放,存放函数的参数值,局部变量的值等。    " << endl;
	cout << "*2、堆区(heap)--由程序员分配和释放,若程序员不释放,程序结束时可能由OS回收。 "<< endl;
	cout << "*3、全局区(静态区)(static)--存放全局变量和静态变量以及常量" << endl;
	cout << "*******************************************************************************" << endl;



	//栈区(stack)-存放函数的参数值,局部变量的值、局部常量等。
	cout << "\n1、栈区(stack): \n" << endl;
	cout << "局部变量,也就是栈local_a地址为: " << (int)&local_a << endl;
	cout << "局部常量g_c3地址为: " << (int)&g_c3 << endl;
	fun_p(g_n_s);//打印函数fun_p的参数

	//堆区(heap) — 由程序员分配和释放,若程序员不释放,程序结束时可能由OS回收。
	cout << "\n2、堆区(heap):\n " << endl;

	cout << "new开辟的堆指针long dui地址为: " << (int)dui_new << endl;
	cout << "malloc开辟的堆指针long dui地址为: " << (int)dui_malloc << endl;

	//全局区(静态区)(static)—存放全局变量和全部静态变量以及全局常量
	cout << "\n3、全局区(静态区)(static): \n" << endl;
	cout << "全局变量(不是栈的),变量long g_n_s地址为: " << (int)&g_n_s << endl;
	cout << "全局静态变量s_a地址为: " << (int)&s_a << endl;
	cout << "局部静态变量s_l_a地址为: " << (int)&s_l_a << endl;
	cout << "全局常量g_c2地址为: " << (int)&g_c2 << endl;
	

	system("pause");
	return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水浒传鲁智深

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值