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

ops/2024/10/18 18:17:51/

//内存四区: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/ops/119150.html

相关文章

C++ 模板

C++ 模板 C++ 模板是 C++ 语言中的一项强大特性,它允许程序员编写与数据类型无关的代码。模板提供了代码复用的一种方式,使得同样的算法或数据结构可以用于不同的数据类型,从而提高代码的通用性和可维护性。本文将深入探讨 C++ 模板的概念、用法和优势。 模板的概念 在 C…

Debian 配置 Python 开发与运行环境

配置 Python 开发与运行环境。 1.3.1. Debian下的安装与配置 Debian 是一个致力于自由软件开发并宣扬自由软件基金会理念的自愿者组织。 Debian 计划创建于 1993 年。当时&#xff0c;Ian Murdock 发出一份公开信&#xff0c; 邀请软件开发者们参与构建一个基于较新的 Linux …

手搓游戏 —— 生成式 AI 助手 Amazon Q Developer 初体验

文章目录 一、Amazon Q介绍二、实验环境准备2.1 下载项目安装包2.2 验证 Python 环境2.3 安装Amazon Q扩展2.4 授权Builder ID 三、Amazon Q 快速理解main.py四、Amazon Q快速梳理控制器逻辑五、启动像素沙盒开放世界程序六、在 update() 中实现传送功能七、定位并修复代码漏洞…

删除二叉树中以x为根节点的子树(包括根结点)

已知二叉树以二叉链表存储&#xff0c;编写算法完成&#xff1a;对于树中每个元素值为x的结点&#xff0c;删除以它为根的子树&#xff0c;并释放相应的空间。 思想&#xff1a; 删除二叉树采用后序遍历。先删除左子树&#xff0c;然后右子树&#xff0c;最后根。 利用层次遍…

三、数据分析入门

数据分析————pandas 前言一、DataFrame-保存数据到文件二、DataFrame-读取文件数据三、DataFrame-数据分析入门3.1 按列加载数据3.2 按行加载数据3.3 获取指定行 / 列数据 四、DataFrame-分组聚合计算五、Pandas-常用排序方法5.1 加载数据并查看5.2 完整具体需求 六、综合案…

python14_运算符复合赋值

复合赋值缩写 A 7 B 3 C "hello" D "world" E True F False# 加法赋值运算符,7 3 10 def add1(a, b):a b # 等同于a a breturn a# 字符串加法赋值运算符,hello world helloworld def add2(c, d):c d # 等同于字符串拼接,c c dreturn c# …

家庭网络的ip安全性高吗

家庭网络的IP安全性是一个重要的话题&#xff0c;涉及到如何保护家庭设备和用户的隐私。家庭网络的安全性既有其优势&#xff0c;也存在一些潜在的风险。以下是关于家庭网络IP安全性的几个关键点&#xff1a; 1. 家庭网络的优势 私有IP地址的使用 家庭网络中的设备通常使用私…

【工欲善其事】巧用 Sublime Text 生成带格式的 HTML 片段

文章目录 【工欲善其事】巧用 Sublime Text 生成带格式的 HTML 片段1 问题由来2 操作流程步骤1&#xff1a;打开代码片段定制页步骤2&#xff1a;在新标签页输入定制 XML步骤3&#xff1a;保存定义内容步骤4&#xff1a;功能测试 3 拓展 【工欲善其事】巧用 Sublime Text 生成带…