当前位置: 首页> 汽车> 维修 > C++内存布局

C++内存布局

时间:2025/7/11 9:30:48来源:https://blog.csdn.net/Edward1027/article/details/142135502 浏览次数: 0次

文章目录

    • C++内存布局
      • 1.文字介绍
      • 2.图片介绍
      • 3.代码介绍

C++内存布局

1.文字介绍

1.内核态空间

2.用户态空间
(1)栈区:存储局部变量函数调用的相关信息,栈的特点是自动分配和释放,由操作系统管理。栈由高地址向低地址生长,通常为0x7ff
(2)堆区:堆区用于动态分配的内存(new、malloc),由程序员分配,由低地址向高地址生长,堆区与栈区没有明确的界限,通常为0x5
(3)全局/静态区:读写段(数据段),存放全局变量、静态变量。
分为:①已初始化数据段.data ②未初始化数据段.bss
(4)文字常量区:只读段.rodata,存放程序中直接使用的常量,如 字符串常量、整数常量、浮点数常量
(5)程序代码区:只读段,存放函数体的二进制代码



2.图片介绍

在这里插入图片描述
在这里插入图片描述



3.代码介绍

(1)堆比栈的地址更低
(2)堆区是动态分配的,地址不一定连续
(3)全局变量在堆之下
(4)静态变量 和 全局变量是混合存放的。先定义的在低地址。

//memory_layout.cpp
#include <stdio.h>
#include <iostream> 
using std::cout;
using std::endl;int global_num = 1;int main()
{int num = 1;          //栈变量cout << "栈变量1的地址 :" << &num << endl; //输出栈变量的地址:0x7ffc2050a440int num2 = 2;          //栈变量cout << "栈变量2的地址 :" << &num2 << endl; //输出栈变量的地址:0x7ffc2050a444int *p = new int(1);  //堆变量cout << "堆变量的地址  :" << p << endl;    //输出堆变量的地址:0x56bb74428280int *p2 = new int(2);  //堆变量cout << "堆变量2的地址 :" << p2 << endl;    //输出堆变量的地址:0x56bb744282a0//对比发现,堆变量的地址比栈变量低//即,堆变量是低地址,栈变量是高地址cout << "全局变量的地址:" << &global_num << endl; //0x56bb73306010static int static_num = 1;cout << "静态变量的地址:" << &static_num << endl; //0x56bb73306014//对比可以发现,全局变量和静态变量是混合存放的。略低于堆区const char * pstr = "hello";cout << pstr << endl;   //hello    cout会默认重载char *printf("文字常量区的地址:%p\n", pstr);   //0x56012fd1ddabcout << "文字常量区的地址:"<< static_cast<void *>(const_cast<char*>(pstr))<<endl;//发现文字常量区,比全局静态区的地址更低printf("main函数的地址:%p\n",&main);//发现程序代码段,比文字常量区更低return 0;
}

在这里插入图片描述

在这里插入图片描述

关键字:C++内存布局

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: