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

//内存四区: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.mzph.cn/news/880704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6种MySQL高可用方案对比分析

大家好&#xff0c;我是 V 哥&#xff0c;关于 MySQL 高可用方案&#xff0c;在面试中频频出现&#xff0c;有同学在字节面试就遇到过&#xff0c;主要考察你在高可用项目中是如何应用的&#xff0c;V 哥整理了6种方案&#xff0c;供你参考。 MySQL的高可用方案有多种&#xf…

rdp远程桌面服务协议概述

rdp远程桌面服务协议概述 什么是远程桌面服务远程桌面服务的通信过程及功能 建立连接资源重定向与用户体验断开连接 远程桌面服务的协议架构 核心协议与基础通信虚拟通道与扩展协议协议协作与层次划分协议的可扩展性协议扩展与性能优化 总结参考 rdp远程桌面服务协议概述 对于…

SpringBoot(Java)实现MQTT连接(本地Mosquitto)通讯调试

1.工作及使用背景 工作中需要跟收集各种硬件或传感器数据用于Web展示及统计计算分析&#xff0c;如电表、流量计、泵、控制器等物联网设备。 目前的思路及解决策略是使用力控或者杰控等组态软件实现数据的转储&#xff08;也会涉及收费问题&#xff09;&#xff0c;通过组态软件…

鸿蒙开发(NEXT/API 12)【应用间消息通信】手机侧应用开发

在手机侧与穿戴设备侧构建应用到应用的通信隧道&#xff0c;用于收发应用自定义的报文消息以及文件。实现手机应用和穿戴设备应用间的交互&#xff0c;为用户提供分布式场景和体验。比如手机应用发送音频文件到穿戴设备侧应用&#xff0c;实现在穿戴设备侧应用上播放音乐&#…

php函数安全漏洞的挖掘与修复技巧

PHP 函数安全漏洞的挖掘与修复技巧 简介 PHP 函数中经常存在安全漏洞&#xff0c;例如 SQL 注入和跨站脚本攻击 (XSS)。了解如何挖掘和修复这些漏洞对于确保 Web 应用程序的安全性至关重要。 漏洞挖掘 以下是挖掘 PHP 函数安全漏洞的一些技巧&#xff1a; 参数检查&#xf…

BUG——IMX6ULL编译正点原子Linux内核报错

最初编译的是正点原子改过的Linux内核&#xff0c;可能是版本问题&#xff0c;一直报错&#xff0c;无法成功编译。然后换成NXP官方Linux内核6.6版本&#xff0c;初始编译虽然也报各种错&#xff0c;但都是缺少库或相关工具&#xff0c;全部安装后就可以成功编译出镜像了&#…

Leetcode 740. 删除并获得点数

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums &#xff0c;你可以对它进行一些操作。 每次操作中&#xff0c;选择任意一个 nums[i] &#xff0c;删除它并获得 nums[i] 的点数。之后&#xff0c;你必须删除 所有 等于 nums[i] - 1 和…

cscode搭建vue项目

创建前安装环境 ctrlj弹出终端 window需要管理员运行并且授权 node -v # 显示版本号&#xff0c;说明 node 已经装好 npm -v # 显示版本号&#xff0c;说明 npm 可以使用 # 安装cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm -v # 显示版本号&a…

Spring中如何为静态变量注入值

在 Spring 中&#xff0c;如果使用 Value 注解注入值&#xff0c;不能将其应用于 static 字段。Spring 只能为实例变量注入值&#xff0c;不能直接对静态变量进行注入。 使用 PostConstruct 初始化&#xff1a; 如果确实需要在静态上下文中使用该值&#xff0c;可以使用 Post…

机器学习(1)——线性回归、线性分类与梯度下降

文章目录 线性回归线性分类线性可分数据线性不可分数据逻辑回归支持向量机 梯度下降批量梯度下降随机梯度下降批量随机梯度下降 线性回归 概述&#xff1a; 在一元线性回归中&#xff0c;我们假设目标变量y与特征变量x存在线性关系&#xff0c;模型表达式为&#xff1a; y …

【hot100-java】【合并两个有序链表】

记忆中&#xff0c;两个指针合并即可。 建立哨兵节点dum /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { t…

Docker更换阿里容器镜像源

以Mac为例&#xff0c; 一、获取阿里容器镜像加速器地址 访问阿里云官网https://cn.aliyun.com/ 登录阿里云&#xff0c;没有账号就注册一个 登录完成后在搜索框搜索&#xff0c;容器镜像服务&#xff0c;并打开 点击管理控制台&#xff0c;进入管理控制台 左侧点击镜像加速…

【Python入门】20个Python自动化脚本,解放双手、事半功倍

如果你正在学习Python&#xff0c;那么你需要的话可以&#xff0c;点击这里&#x1f449;Python重磅福利&#xff1a;入门&进阶全套学习资料、电子书、软件包、项目源码等等免费分享&#xff01; 在当今的快节奏工作环境中&#xff0c;自动化不再是一种奢侈&#xff0c;而是…

下一代性能怪兽RTX 5090最新规格更新与Blackwell架构解析

据悉&#xff0c;目前各家AIC厂商已经陆续收到NVIDIA的相关资料&#xff0c;RTX 5090、RTX 5080已经正式进入开案阶段&#xff0c;也就是厂商们开始设计各自的产品方案了。不出意外&#xff0c;年初的CES 2025上会看到RTX 5090/5080的发布。 作为NVIDIA的新一代GPU&#xff0c…

【车联网安全】车端知识调研

一、CAN总线&#xff1a; 1、定义&#xff1a; CAN 总线相当于汽车的神经网络&#xff0c;连接车内各控制系统,其通信采用广播机制&#xff0c;各连接部件均可收发控制消息&#xff0c;通信效率高&#xff0c;可确保通信实时性。当前市场上的汽车至少拥有一个CAN网络&#xff0…

Leetcode 3302. Find the Lexicographically Smallest Valid Sequence

Leetcode 3302. Find the Lexicographically Smallest Valid Sequence 1. 解题思路2. 代码实现 题目链接&#xff1a;3302. Find the Lexicographically Smallest Valid Sequence 1. 解题思路 这一题的话由于至多只能够修改一个字符&#xff0c;因此&#xff0c;我们就是要考…

如何进行“服务器内部错误”的诊断 | OceanBase诊断案例

本文作者&#xff1a;任仲禹&#xff0c;爱可生数据库高级工程师&#xff0c;擅长故障分析和性能优化。 的OMS迁移工具具备丰富的功能。但在实际运维场景中&#xff0c;我们可能会遇到各种问题&#xff0c;其中“服务器内部错误”便是一个较为棘手的问题&#xff0c;因为界面上…

PHP 递归遍历目录

本篇文章主要内容为PHP 两种循环递归遍历目录的示例。 目录 while循环 foreach循环 调用及结果 总结 while循环 应用while循环和opendir、readdir函数处理读取路径下所有文件和目录。 具体代码如下&#xff1a; function getDir($path, $space ) {$dir opendir($path)…

【易上手快捷开发新框架技术】nicegui标签组件lable用法庖丁解牛深度解读和示例源代码IDE运行和调试通过截图为证

传奇开心果微博文系列 序言一、标签组件lable最基本用法示例1.在网页上显示出 Hello World 的标签示例2. 使用 style 参数改变标签样式示例 二、标签组件lable更多用法示例1. 添加按钮动态修改标签文字2. 点击按钮动态改变标签内容、颜色、大小和粗细示例代码3. 添加开关组件动…

PHP“===”的意义

在PHP中&#xff0c; 运算符被称为“恒等比较运算符”&#xff08;Identical Comparison Operator&#xff09;&#xff0c;它用于比较两个变量的值和类型是否完全相同。这个运算符与双等号 &#xff08;等值比较运算符&#xff09;不同&#xff0c;后者在比较时会对两边的值进…