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;
}