程序的内存分区

版权声明:本文为(汉诺塔少年)原创文章,非商用自由转载-保持署名-著名出处,谢谢。https://blog.csdn.net/qq_40780910/article/details/82253276

 

内存分区

       操作系统一般会把内存划分区域来使用,以便于管理,如代码区、数据区等。被编译成机器的码的程序在

执行时会被复制到内存的代码区,程序中的变量和常量会被存放到数据区。在编写和调试程序的时候,我们经

常会看到某段内存的区域在某时刻的“快照”。

 

一.内存空间分区图

 

《程序的内存分区》

 

1)代码区

存放函数体的二进制代码。

2)栈区

由编译器自己分配和释放,存放函数体内定义的局部变量、函数形式参数等。

栈区的操作具有“先入后出”的特点,就像堆盘子,先放的盘子最后才能拿出来。

3)全局数据区

存放着全局变量、静态局部变量,当一个变量被定义为全局变量或者静态全局

变量时,从程序开始执行到结束,它都会在内存中占有固定的字节。

4)常量区

存储字符串常量、整型常量等常量的地方。

5)堆区

在程序执行过程中申请的内存空间属于堆区,这些申请空间需要程序员手动释放。

 

二、静态全局变量和非静态全局变量的区别

1)

若程序由一个源文件构成二者无区别。

2)

若程序由多个文件构成,则静态全局变量在其定义的文件夹内单独使用,不必担心其他源文件

使用相同的变量名字,彼此相互独立。

3)

非静态全局变量  若想在其他源文件使用,可以由其他源文件使用 关键字external调用。

静态全局变量     在其他文件也无法使用关键字 external调用。

4)

综上,如果使用关键字 static 申明了一个全局变量,那么这个全局变量仅仅限制为本文件使用,

其它文件不能使用。如果不加关键字 static定义了一个全局变量,这个全局变量则可以被其他文

件通过关键字external调用。

5)举个栗子

//file1.cpp
int a=100;

//file2.cpp
external int a;  //申明这个整型变量a已经在其他文件定义
int a=10;        //现在就可以使用a了

三、静态局部变量和非静态局部变量的区别

1)

静态局部变量有关键字static定义:

#include<iostream>
using namespace std;
int a=10;               //全局变量
void main()
{
   static int  b=10;   //静态局部变量的定义   
   }

 

2)

静态局部变量赋值语句只能起作用一次,如果定义时候未被初始化,系统默认为0.

3)举个栗子

#include<iostream>
using namespace std;
void mian()
{  
  for(int i=0;i<2;i++)
{
     static int a=0;   //该句话仅仅起作用一次
     a=a+1;
     cout<<a<<endl;
    }

}

 

最后a的值是2,因为第二次循环时候 static int a=0;已经无效了,a不会再被赋值为0,如果没有static ,局部变量a

又会被赋值为0.

《程序的内存分区》

四.通过地址可以看出内存的分区

#include<iostream>
using namespace std;
int a = 10;               //全局变量
int main()
{
	int b = 20, c = 30;   //局部变量   
	static int e = 50;    //静态变量

	int *p = new int(50); //申请堆空间
	float *f = new float(0);
	int *q = new int(60);

	const char*ch = "Beijing";//常量
	cout << "全局变量a的地址: " << &a << endl;
	cout << "局部变量b的地址: " << &b << endl;
	cout << "局部变量c的地址: " << &c << endl;
	cout << "常量区的地址:     " << (void*)ch << endl;
	cout << "静态变量e的地址: " << &e << endl;
	cout << "堆区变量p的地址: " << p << endl;
	cout << "堆区变量f的地址: " << f << endl;
	cout << "堆区变量q的地址: " << q<< endl;

	delete p;
	delete f;
	delete q;

}

运行结果:

《程序的内存分区》

可以发现,

全局变量和静态变量位于一个区域,先定义的放在低地址,后定义的放在高地址。

局部变量正好相反,先定义的放在高地址,后定义的放在低地址。

 

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/qq_40780910/article/details/82253276
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞