内存的分区与数据的存放
linux-dash
A beautiful web dashboard for Linux
项目地址:https://gitcode.com/gh_mirrors/li/linux-dash
免费下载资源
·
典型的存储器安排(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 年前
更多推荐
已为社区贡献1条内容
所有评论(0)