C++进程的内存空间
2022/1/10 7:08:08
本文主要是介绍C++进程的内存空间,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
保留区 | 0地址开始 C库 |
代码区 | .text 函数代码 |
全局变量区 | .data 非0值和未初始化的.bss区 |
堆区 |
new 分配空间 delete 释放空间 |
栈区 | {}内定义的变量,出了括号自动清理 |
命令行参数 环境变量 |
|
内核空间 | 高地址 一般windows2G Linux1G |
通过代码对地址进行分析
#include<iostream> #include<vector> #include<stdlib.h> #include<string> using namespace std; int s1; int s2 = 0; int s3 = 1; int s4 = 2; static int s5 = 1; int main(void) { static int s6; static int s7=0; static int s8=1; cout << "代码区的地址" << main << endl; cout << "未初始化的全局变量s1 = " << &s1 << endl; cout << "初始化为0的全局变量s2 = " << &s2 << endl; cout << "初始化为1的全局变量s3 = " << &s3 << endl; cout << "初始化为2的全局变量s4 = " << &s4 << endl; cout << "初始化为1的静态全局变量s5 = " << &s5 << endl; cout << "未初始化的局部静态变量s6 = " << &s6 << endl; cout << "初始化为0的局部静态变量s7 = " << &s7 << endl; cout << "未初始化的局部静态变量s8 = " << &s8 << endl; int* p1 = new int; int* p2 = new int; cout << "p1堆区的地址" << p1 << endl; cout << "p2堆区的地址" << p2 << endl; int t0; int t1 = 0; int t2 = 1; cout << "未初始化的t0 = " << &t0 << endl; cout << "初始化为0的t1 = " << &t1 << endl; cout << "初始化为1的t2 = " << &t2 << endl; return 0; }
这是结果
可以分析得出:
(1)未初始化和初始化为0的全局变量和静态变量存储在一起(.bss区),已经初始化的又分配在另一片空间。
(2)堆区的地址是从低地址向高地址分配的。
(3)栈区的地址是从高地址向低地址分配的。
可以看到 int *p1 = new int;做了两件事情,在栈中为p1指针创建了一个内存空间,同时在堆中创建了一个空间供p1指向,这时候修改p1所指向的内容其实是修改堆中的内容。
这篇关于C++进程的内存空间的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享