典型的存储器安排(Linux下的内存分配)

栈区:由编译器自动分配与释放。用于存放局部变量、函数参数、函数返回值。特点:效率高,但空间大小有限。

堆区:使用malloc或者new开辟的空间都是在堆上分配的,需要程序员显示地释放。如果没有释放,在程序运行结束时可能由OS回收。特点:使用灵活,空间较大,但容易出错。

BSS:没有进行未初始化操作的全局变量和静态变量放在该区,会被自动初始化为0。

数据区:初始化后的全局变量和静态变量还有常量放在该区。

注意:有的人也会把BSS和数据都叫做数据区。

(自由存储区):实际上就是堆区,虽然网上有很多说它是跟堆类似的,但是经过我的多次测试发现它其实就是在堆区,此外,还有一个解释,那就是new的底层是调用了malloc函数的,new开辟的空间是在堆上,那么malloc不也应该是在堆上么。

只读数据区(字面常量区):该区界于代码区和数据区之间,有的人把它归类于代码区,也有的人把它归类于数据区。不管怎么归类,只要自己清楚它是在数据区和代码区的之间就行了。该区一般用于存储只读数据的,字面常量都存在这个区里边。

这里需要注意的是const修饰的变量并不会存放在该区,而是取决于它定义的地方,局部定义的就存在栈区,全局定义的就存放在静态区。可能有的人会疑惑,const修饰的变量不是不能修改的么,是只读的,那应该存在只读数据区啊,事实上,C语言中,使用const修饰了一个变量,该变量不能直接修改,但是我们可以通过拿到这个变量的地址,然后通过它的地址来修改它,如果存放在只读数据区,拿到地址也是没法修改的。

#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>

int d;					//静态区(全局区)
int e = 5;				//静态区(全局区)
static int f = 6;		//静态区(全局区)
static int g;			//静态区(全局区)

void FunTest()
{
	int *p1 = (int*)malloc(sizeof(int));  //在堆上开辟
	int *p2 = new int;			//在堆上开辟
	cout << "用malloc申请 p1: " << p1 << endl << endl;
	cout << "用new申请 p2: " << p2 << endl << endl;
}

int main()
{
	int a = 2;			 //栈
	int b;				 //栈
	static int c = 4;	 //静态区(全局区)
	static int h;		 //静态区(全局区)
	const char* p = "abcde";	 //p在栈上,“abcde”在常量区

	cout << "局部变量初始化 a : " << &a << "  " << a << endl << endl;
	cout << "局部变量未初始化 b: " << &b << "  " << b << endl << endl;
	cout << "静态局部变量初始化 c: " << &c << "  " << c << endl << endl;
	cout << "静态局部变量未初始化 h: " << &h << "  " << h << endl << endl;
	cout << "全局未初始化 d: " << &d << "  " << d << endl << endl;
	cout << "全局初始化 e: " << &e << "  " << e << endl << endl;
	cout << "静态初始化 f: " << &f << "  " << f << endl << endl;
	cout << "静态未初始化 g: " << &g << "  " << g << endl << endl;
	cout << "指向常量字符串的指针 p: " << &p << endl << endl;
	FunTest();
	
	return 0;
}

 

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:23 天前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐