(c++)内存四区:1.代码区2.全局区(静态区)3.栈区4.堆区

server/2024/10/18 23:39:29/

//内存四区:1.代码区   2.全局区  3.栈区  4.堆区

1.放在代码区的有:1.写的代码:只读的、共享的、存放的二进制机器指令、由操作系统直接管理
2.放在全局区的有:1.全局的(变量或常量)  2.静态的(变量或常量)  3.字符串常量
3.在栈区的有:1.局部的(变量或常量)

注:1.函数形参也是局部的 2.main()函数内创建的变量也是局部变量

3.对于一个局部变量指针,若它指向的空间在栈区,不要返回这个指针。由于变量是局部变量,函数结束后局部变量的就自动释放了,这块地址上的空间你也不能再操作了,除非你返回的这个地址在堆区。

对于一个局部变量指针,若它指向的空间在堆区,可以返回这个指针。虽然函数结束后这个指针同样会被释放,但是已经将地址传递出去了,并且由于他的地址在堆区所以虽然函数结束了但是这块空间依然能够被操作。

以上两种情况下在函数内创建的指针,在函数结束后都被释放了,只不过前者返回出来的地址不能用了,后者返回出来的地址仍然可以操控。

关键在于:指针指向的地址空间在栈区还是堆区,在栈区则不要返回(返回了也不能操纵,这块空间,因为编译器自动释放了)、在堆区则可以。

4.放在堆区的有:利用new创建的数据。可以通过delete释放

创建的操作为:

int* p2 = new int(10);

    //new int(10)代表开辟一个堆区的空间并且赋值为10,整个表达式会返回这个空间的地址。
    //int* p创建一个指针p。
    //int* p=new int(10)  用创建的这个指针p来接收new int(10)返回的地址

以下代码在干嘛?在创建各种变量、常量、局部的、全局的、静态的,然后访问他们的内存地址。

注意!!!最后一个cout是为了演示delete后还要访问这个堆区的空间会引发的异常,读者使用代码时请给注释掉

#include<iostream>
using namespace std;// 内存四区:1.代码区  2.全局区  3.栈区  4.堆区
//1.放在代码区的有:1.写的代码
//2.放在全局区的有:1.全局的(变量或常量)  2.静态的(变量或常量)  3.字符串常量
//3.在栈区的有:1.局部的(变量或常量),程序员创建,编译器自动释放
//4.放在堆区的有:1.new开辟的空间,由程序员创建和释放(整个程序运行完了也会自动释放)//全局变量
int g_a = 0;
int g_b = 0;//const修饰的全局变量
const int c_g_a = 0;
const int c_g_b = 0;//static修饰的全局变量
static int s_g_a = 0;
static int s_g_b = 0;int* func1()
{int a = 10;int* p1 = &a;return p1;
}//利用new将数据放在堆区
int* func2()
{//new int(10)代表开辟一个堆区的空间并且赋值为10,整个表达式会这个空间的地址。//int* p创建一个指针p。//int* p=new int(10)  用创建的这个指针p来接收new int(10)返回的地址int* p2 = new int(10);return p2;
}int main()
{//全局变量cout << "全局变量g_a的地址为:\t\t" << (int)&g_a << endl;cout << "全局变量g_b的地址为:\t\t" << (int)&g_b << endl;//静态变量 在普通变量前面加static,属于静态变量static int s_a = 0;static int s_b = 0;cout << "静态局部变量s_a的地址为:\t" << (int)&s_a << endl;cout << "静态局部变量s_b的地址为:\t" << (int)&s_b << endl;//cout << "静态全局变量s_g_a的地址为:\t" << (int)&s_g_a << endl;cout << "静态全局变量s_g_b的地址为:\t" << (int)&s_g_b << endl;//常量分为1.字符串常量2.const修饰的变量cout << "字符串常量的地址:\t\t" << (int)&"hello world" << endl;//const修饰的变量:1.修饰全局变量  2.修饰局部变量cout << "全局常量c_g_a的地址为:\t\t" << (int)&c_g_a << endl;cout << "全局常量c_g_b的地址为:\t\t" << (int)&c_g_b << endl;//修饰局部变量cout << endl;const int c_l_a = 0;const int c_l_b = 0;cout << "局部常量c_l_b的地址为:\t" << (int)&c_l_a << endl;cout << "局部常量c_l_b的地址为:\t" << (int)&c_l_b << endl;//创建普通局部变量int a = 0;int b = 10;cout << "局部变量a的地址为:\t" << (int)&a << endl;cout << "局部变量b的地址为:\t" << (int)&b << endl;cout << endl;//读取指向栈区空间指针的值(不能正常读取,部分编译器第一次可以正常读取,之后便不行了)int* p1 = func1();cout << "第一次读取指向栈区空间的指针的值:" << *p1 << endl;cout << "第二次读取指向栈区空间的指针的值:" << *p1 << endl;cout << endl;//读取指向堆区空间指针的值int* p2 = func2();cout << "第一次读取指向堆区空间的指针的值:" << *p2 << endl;cout << "第二次读取指向堆区空间的指针的值:" << *p2 << endl;//delete这个指针后再访问delete p2;//注意这行代码会引发异常!!!!使用代码请注释掉下面这个coutcout << "delete p2后读取指向堆区空间的指针的值:" << *p2 << endl;system("pause");return 0;
}

注意!!!最后一个cout是为了演示delete后还要访问这个堆区的空间会引发的异常,读者使用代码时请给注释掉

代码运行截图:

显然:

1.只要是带“全局”或者“静态”的都在一起,还有字符串常量也是。

2.只要是带“局部”的也都放在一起。

3.若局部变量指针指向的地址在栈区,则无法访问

4.若局部变量指针指向的地址在堆区,则能够正常访问

5.若将这个指针delete后便不能够正常访问了,也没有访问的权限。


http://www.ppmy.cn/server/125222.html

相关文章

深度学习-20-深入理解基于Streamlit和minimind小模型开发本地聊天工具

文章目录 1 Streamlit开发聊天工具1.1 初始化聊天信息1.2 渲染历史信息1.3 接收用户输入1.4 模拟调用LLM1.5 整体代码2 使用minimind2.1 下载模型2.2 使用模型3 Streamlit与minimind3.1 Streamlit相关知识点3.2 示例代码4 参考附录1 Streamlit开发聊天工具 Streamlit是一个开源…

BSS是什么

终端能够连上该BSS&#xff0c;主要取决于几个关键因素&#xff0c;包括无线网络的设置、终端设备的配置以及环境条件等。以下是一些详细的步骤和要点&#xff1a; 1. 确保无线网络&#xff08;BSS&#xff09;已正确设置 SSID&#xff08;服务集标识符&#xff09;&#xff…

人工智能技术在电磁场与微波技术专业的应用

在人工智能与计算电磁学的融合背景下&#xff0c;电磁学的研究和应用正在经历一场革命。计算电磁 学是研究电磁场和电磁波在不同介质中的传播、散射和辐射等问题的学科&#xff0c;它在通信、雷达、无 线能量传输等领域具有广泛的应用。随着人工智能技术的发展&#xff0c;这一…

Hive SQL业务场景:连续5天涨幅超过5%股票

一、需求描述 现有一张股票价格表 dwd_stock_trade_dtl 有3个字段分别是&#xff1a; 股票代码(stock_code), 日期(trade_date)&#xff0c; 收盘价格(closing_price) 。 请找出满足连续5天以上&#xff08;含&#xff09;每天上涨超过5%的股票&#xff0c;并给出连续满足…

Android 版本适配

Android 版本适配 Android 7.0 (API 24) 适配 电池和内存 低电耗模式 此项新增的行为不会影响有关使您的应用适应Android 6.0&#xff08;API级别23&#xff09;中所推出的旧版本低电耗模式的建议和最佳做法&#xff0c;如对低电耗模式和应用待机模式进行针对性优化中所讨论…

AI驱动的智能运维:行业案例与挑战解析

华为、蚂蚁、字节跳动如何引领智能运维&#xff1f; ©作者|潇潇 来源|神州问学 引言 OpenAI 发布的 ChatGPT 就像是打开了潘多拉的魔盒&#xff0c;释放出了生产环境中的大语言模型&#xff08;LLMs&#xff09;。一些新的概念&#xff1a;“大语言模型运维 (LLMOps)”…

职业技能大赛-自动化测试笔记(PageObject)分享-4

前言 Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题 等),这样在Selenium测试页面中可以通过调用页面类来获取页面元素,这样巧妙的避免了当页面元素id或者位置变化…

从静态多态、动态多态到虚函数表、虚函数指针

多态&#xff08;Polymorphism&#xff09;是面向对象编程中的一个重要概念&#xff0c;它允许不同类的对象对同一消息做出不同的响应。多态性使得可以使用统一的接口来操作不同类的对象&#xff0c;从而提高了代码的灵活性和可扩展性。 一、多态的表现形式 1. 静态多态&…