那些不属性的C语言关键字-const

news2024/12/18 6:29:05

        大家都知道const修饰的变量是不可变的,但是到底是怎么实现的那,有方法修改只读变量的值吗,今天我们结合实验代码,分析下const关键字的实现原理

const变量

1.const修饰局部变量

int main(){
    const int abc = 123;
	printf("%d\n", abc);
	abc = 234;
    return 0;
}

我们会得到错误信息: E0137    表达式必须是可修改的左值

这种是编译器做了静态语法分析,约束变量abc不能被修改。

验证逻辑:
1. 使用整型指针指向abc变量的地址

2. 通过指针修改const修饰的abc变量的值为234

3.查看abc变量的值,如果是234,说明const修饰的局部变量之所以不能被修改是因为编译器做了静态语法检查

int main(){
    const int abc = 123;
	printf("%d\n", abc);
	int* p = (int*) & abc;
	*p = 234;
	printf("%d\n", abc);
    return 0;
}


 查看abc变量的内容是0x7b就是十进制的123

执行完代码*p=234后我们可以发现abc变量内存地址对应的值确实被改了。

注:大家可以猜测下接下来要执行的printf("%d\n",abc)会在控制台输出123,还是234?欢迎大家留言讨论

2.const修饰全局变量

const int hah = 234;
int main() {
	printf("%d\n", hah);
	hah = 345;
	int* p = (int*) & hah;
	*p = 345;
	printf("%d\n", hah);
    return 0;
}

我们同样会得到错误信息: E0137    表达式必须是可修改的左值

这种是编译器做了静态语法分析,约束变量abc不能被修改。同时我们要验证是否有动态执行的验证逻辑。同样使用指针指向变量地址,然后强制修改变量的值,看结果

触发了访问异常,说明有动态执行的保护逻辑

总结:

1.const修饰的变量会受到编译器静态语法分析的保护,不能直接复制

2.const修饰的局部变量会分配到栈内存中,栈的内存属性是可写的,所以可以通过指针强制修改,而const修饰的全局变量会被编译到只读属性的节中,程序运行起来只读变量所在的内存没有写属性,所以通过指针强制修改会触发访问异常

提问:

1. const修饰的全局变量可以在运行时被强制修改吗?

2. const修饰局部变量的实验中,指针成功修改const变量的值后,后面的printf语句应该输出什么123还是234?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2261445.html

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

相关文章

【Java 数据结构】List -> 给我一个接口!!!

🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 什么是 List 2. List 常用的方法 3. List 的使用 1. 什么是 List 其实 List 是一个接口,它继承了 Collection 接口 下列为 List 接口中的各种…

【5G】5G的主要架构选项

最初,在3GPP讨论中考虑了所有可能的聚合和核心网络组合,共有八个架构选项。以下重点介绍option2、3、4和7。 1. 独立组网 (Standalone, SA) 架构选项 2 :Standalone architecture with 5G-core 特点: 5G核心网(5GC, …

Ajax简单理解

Ajax 1 什么是ajax AJAXAsynchronous JavaScript and XML (异步的JavaScript和XML)AJAX不是新的编程语言,二十一种使用现有标准的新方法 AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。 AJAX 不需要任何浏…

【GESP】C++二级考试大纲知识点梳理, (2)计算机网络的基本概念及分类

GESP C二级官方考试大纲中,共有9条考点,本文针对C(2)号知识点进行总结梳理。 (2)了解计算机网络的概念,了解计算机网络的分类(广域网(WAN)、城域网&#xff0…

相机与NAS的奇妙组合,如何使用相机拍照自动上传或备份到NAS

相机与NAS的奇妙组合,如何使用相机拍照自动上传或备份到NAS 哈喽小伙伴们好,我是Stark-C~ 对于喜欢使用专业器材拍照摄影的小伙伴来说,想要将相机存储卡中的照片或视频导出到电脑上,要么是使用数据线直接和相机连接,…

window下的qt5.14.2配置vs2022

这里做一个笔记,已知qt5.14.2和vs2022不兼容,无法自动扫描到vs的编译器。但由于团队协作原因,必须使用qt5.14.2,并且第三方库又依赖vs2022。其实qt5.15.2是支持vs2022的,如果能够用qt5.15.2,还是建议使用qt…

QT从入门到精通(一)——Qlabel介绍与使用

1. QT介绍——代码测试 Qt 是一个跨平台的应用程序开发框架,广泛用于开发图形用户界面(GUI)应用程序,也支持非图形应用程序的开发。Qt 提供了一套工具和库,使得开发者能够高效地构建高性能、可移植的应用程序。以下是…

【协作笔记Trilium Notes Docker部署】开源协作笔记Trilium Notes本地Docker部署远程协作

文章目录 前言1. 安装docker与docker-compose2. 启动容器运行镜像3. 本地访问测试4.安装内网穿透5. 创建公网地址6. 创建固定公网地址 前言 今天分享一款在G站获得了26K的强大的开源在线协作笔记软件,Trilium Notes的中文版如何在Linux环境使用docker本地部署&…

app的测试范围以及web和app的测试区别

目录 图1.App的测试范围1.1功能测试1.2专项测试1.3性能测试 2.Web和App的测试区别2.1相同点2.2不同点 👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的…

数据分析实战—鸢尾花数据分类

1.实战内容 (1) 加载鸢尾花数据集(iris.txt)并存到iris_df中,使用seaborn.lmplot寻找class(种类)项中的异常值,其他异常值也同时处理 。 import pandas as pd from sklearn.datasets import load_iris pd.set_option(display.max_columns, N…

docker 拉取镜像 | 创建容器 | 容器运行

拉取镜像 拉取镜像的命令:docker pull name (name换为你要拉取的镜像名) docker pull docker.1panel.live/hispark/qiankunbp:1.0.0 docker.1panel.live/hispark/qiankunbp:1.0.0为镜像名 拉取海思的镜像:(如果之前拉…

添加标签(vue3)

点击添加按钮: 最多添加5个 注意: 不只可以el-form 进行校验,也可以对单个el-form-item 进行校验 vue elementUI form组件动态添加el-form-item并且动态添加rules必填项校验方法-CSDN博客 el-form 里边有el-form-item ,el-fo…

Dash for Mac 代码API文档管理软件安装

Mac分享吧 文章目录 Dash for Mac 代码API文档管理软件 效果图展示一、Dash 代码API文档管理软件 Mac电脑版——v7.3.31️⃣:下载软件2️⃣:安装软件2.1 左侧安装包拖入右侧文件夹中,等待安装完成,运行软件2.2 打开软件&#xff…

Unity添加newtonsoft-json

package name "com.unity.nuget.newtonsoft-json": "3.2.1",打开包管理器 输入包名称和版本 点击添加

分布式全文检索引擎ElasticSearch-数据的写入存储底层原理

一、数据写入的核心流程 当向 ES 索引写入数据时,整体流程如下: 1、客户端发送写入请求 客户端向 ES 集群的任意节点(称为协调节点,Coordinating Node)发送一个写入请求,比如 index(插入或更…

TensorRT C++ API模型加速 —— TensorRT配置、模型转换、CUDA C++加速、TensorRT C++ 加速

文章目录 前言:TensorRT简介0.1、TensorRT算法流程0.2、TensorRT主要优化技术 一、TensorRT配置1.1、TensorRT环境配置1.1.1、CUDA安装1.1.2、TensorRT下载1.1.3、TensorRT CUDA配置1.1.4、TensorRT配置1.1.4.1、TensorRT python配置1.1.4.2、TensorRT C配置&#x…

RPC 服务与 gRPC 的入门案例

RPC 协议 RPC(Remote Procedure Call Protocol)即远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务的协议,允许一个计算机程序可以像调用本地服务一样调用远程服务 。 RPC的主要作用是不同的服务间方法调用就像本地…

基于Spring Boot的体育商品推荐系统

一、系统背景与目的 随着电子商务的快速发展和人们健康意识的提高,体育商品市场呈现出蓬勃发展的态势。然而,传统的体育商品销售方式存在商品种类繁多、用户选择困难、个性化需求无法满足等问题。为了解决这些问题,基于Spring Boot的体育商品…

在 DDD 中优雅的发送 Kafka 消息

前言 1:host 映射 下载 SwitchHost 配置一个映射地址。点击 添加一个本地环境,之后配置你的 IP kafka 这样就能找这个地址了。IP 为你本地的IP,如果是云服务器就是公网IP地址 使用docker-compose.yml进行一键部署安装 version: 3.0 # docker-compose …

数字电视标准与分类

数字电视相关内容是一个极其成熟且久远的领域,并不像其它的技术方面那么前沿。但是学习技术的另外一个方面也不就是可以维持咱们的好奇心以及认识生活中多个事务后面的技术本质。 近年来,电视领域发生了一系列的变化,电视数字化的进程明显加快…