const变量可以修改么?
遇到了一个关于const修饰的变量值是否能修改问题,虽然我知道const变量在某些情况下可以通过指向它的指针来间接修改,但是对原理还是很模糊,今天就整理了一下。
一、三个试验压压惊
1、直接对const变量修改
#include <stdio.h> int main(void)
{
const int a = ;
a = ;
printf("a=%d",a);
}
编译一下,看看出现什么情况:
很遗憾,编译出错了。
2、const变量通过指针修改试验
#include <stdio.h> int main(void)
{
const int i = ;
int *p = (int *)&i;
*p = ; printf("&i=0x%x \r\n",&i);
printf("p=0x%x \r\n",p);
printf("i=%d \r\n",i);
printf("*p=%d \r\n",*p);
}
~
编译运行,看看出现什么情况:
编译正常,运行正常
3、const变量真的可以通过指针修改么?
#include <stdio.h>
const int i = 5;
int main(void)
{
int *p = (int *)&i;
*p = 10; printf("&i=0x%x \r\n",&i);
printf("p=0x%x \r\n",p);
printf("i=%d \r\n",i);
printf("*p=%d \r\n",*p);
}
编译运行看现象:
编译通过了,运行时出现了段错误。
二、分析
1、const起作用是在那个时期?编译时期还是运行时期?
这个我们可以通过分析实验1和2来进行定论,实验1是通过显式修改的方式来修改变量值,结果编译器报错。那说明在编译时期,编译器就能发现const被修改这个错误;但是实验2,我们通过指针来间接修改它的值,却发现编译器不仅没报错,反而变量值也被成功修改。说明const常量只是一个编译期间的常量。
2、const修饰全局变量可以修改么?
为了搞清楚这个问题,我进行了实验3,却发现运行时出现了段错误。 我们都知道,出现段错误的原因无非就是这么几个:访问一个不存在的地址、访问系统保护的地址、访问只读内存地址、读写一个空指针、堆栈溢出、数组越界等。我们知道const全局变量存储在全局存储空间,而且是只读的,因此试图修改会出现段错误。
const变量可以修改么?的更多相关文章
- const变量的修改实践
https://bbs.csdn.net/topics/110049293 #include <iostream> using namespace std; int main(){ cou ...
- const变量的修改
int main(){ const char a[]="hello world"; char *aa=(char *)a; printf("\nthe a address ...
- C++中如何修改const变量
一.结论 声明:不同于C语言的const变量修改问题(可以通过指针间接修改const变量的值),这里只讨论C++ 里的const. C++ const 修饰符,表示常量,即如果以后保证不会修改则声 ...
- const变量的存储区及修改权限
转自const变量的存储区及修改权限 [cpp] view plaincopy const int a = 1; int *p = const_cast<int*>(&a); *p ...
- const变量通过指针修改问题
const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改. 以下是VC6下才测试. 1. 不能修改的情况 #include int const a = 10; void ma ...
- 修改const变量
看下面的一段代码 ; int * j=(int*)(&i); // 运行正确,j确为i的地址,但 int *j=&i; 编译错误 *j=; //确实改变了i的值 printf(&quo ...
- 为什么为 const 变量重新赋值不是个静态错误
const 和 let 的唯一区别就是用 const 声明的变量不能被重新赋值(只读变量),比如像下面这样就会报错: const foo = 1 foo = 2 // TypeError: Assig ...
- [C#基础知识] ReadOnly关键字修饰的变量可以修改,只是不能重新分配
转自:http://www.cnblogs.com/sujiantao/archive/2011/12/19/2289357.html MSDN 官方的解释 readonly 关键字是可以在字段上使用 ...
- const变量初始化问题
在C++中const变量定义时必须进行初始化,否则无法通过编译. 初始化的方式有多种,可以通过字面值对其进行初始化,也可以通过变量对其初始化,或其他方式,只要能给const变量赋初值即可(当然初值应该 ...
随机推荐
- 实现Modbus TCP多网段客户端应用
对于Modbus TCP来说与Modbus RTU和Modbus ASCII有比较大的区别,因为它是运行于以太网链路之上,是运行于TCP/IP协议之上的一种应用层协议.在协议栈的前两个版本中,Modb ...
- Java使用Jsoup获得新闻联播所有文字稿
Jsoup的maven坐标: <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> <dependency> ...
- 【编程基础】CppLint工具使用过程
前言 coding最好要形成一定的编程风格,一般常用的开源风格有google code style,可以使用cpplint工具检查是否符合该编程风格. 目录 1. linux系统使用过程: 2. wi ...
- keepalived+lvs tcp check 引起的后端服务报Connection reset by peer
方法一: 取消LVS方式进行tcp转发,进而改为http方式反向代理,问题即可解决. 当然,这是在业务允许使用http的情况下,如果必须使用tcp协议,那就得使用下面的方法了. 方法二: 修改keep ...
- Linux 指令表
Linux简介(了解) Linux介绍 Linux是类UNIX计算机的统称 Linux操作系统的内核也是Linux Linux是由芬兰大学生Linux Torvalds于1991年编写的 Linux这 ...
- 如何提高程序员的键盘使用效率(搬砖工人的自我修养(tucao))
高软第一次作业 程序员使用键盘最常用的技能 搬运自:https://learnku.com/articles/22806 括号内为个人吐槽 1.尊重操作系统特性(如Mac OS的某些键位自定义设 ...
- 最新 迅游科技java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.迅游科技等10家互联网公司的校招Offer,因为某些自身原因最终选择了迅游科技.6.7月主要是做系统复习.项目复盘.Leet ...
- jqgrid重新加载后跳到指定页
一般要求重新加载jqgrid后是跳到第一页 $("#jqgrid").jqGrid('setGridParam',{ datatype:'json', page:1 }).trig ...
- 基于python的App UI自动化环境搭建
Android端Ui 自动化环境搭建 一,安装JDK.SDK 二,添加环境变量 Widows:1.系统变量→新建 JAVA_HOME 变量E:\Java\jdk1.7.0 jdk安装目录 2.系统变量 ...
- Beginning Linux Programming 学习--chapter 11 Processes and Signals
What's process--什么是进程? The UNIX standards, specifically IEEE Std 1003.1, 2004 Edition, defines a pr ...