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

这是结果

C++进程的内存空间

可以分析得出:

(1)未初始化和初始化为0的全局变量和静态变量存储在一起(.bss区),已经初始化的又分配在另一片空间。

(2)堆区的地址是从低地址向高地址分配的。

(3)栈区的地址是从高地址向低地址分配的。

C++进程的内存空间

可以看到 int *p1 = new int;做了两件事情,在栈中为p1指针创建了一个内存空间,同时在堆中创建了一个空间供p1指向,这时候修改p1所指向的内容其实是修改堆中的内容。
原文链接: https://www.cnblogs.com/suppersam/p/15781162.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/184291

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 上午10:41
下一篇 2023年2月12日 上午10:41

相关推荐