改变const限定的“常量”

原创 2015年07月10日 12:18:10

  在加深学习C语言const关键字时,产生了一个疑问。const关键字限定的常量真的不可以改变吗?
  不是可以通过指针可以改变内存单元的值吗?那是不是可以通过指针改变const限定的常量呢?
  先看一段代码:

#include <stdio.h>

int main(int argc, char const *argv[])
{
	const int intNum = 10;
	int *pToIntNum = (int *)&intNum;

	*pToIntNum = 100;

	printf("&a = %p\n",&intNum);
	printf("a = %d\n",intNum);

	printf("p = %p\n",pToIntNum);
	printf("*p = %d\n",*pToIntNum);

	return 0;
}

通过gcc 5.1 编译发现,结果如下:

看来指针没有什么用,但是它们的地址是相等的呀。嗯,看来这是一个严重的问题。
于是上网查了一下,发现说的是编译器优化的问题。
其意思是指:当编译器看到const int a = 10;时,可能会做出a的值不会改变的假设,直接把后面的a用10来代替,或者直接使用寄存器里以前存过的a的值,而不是在用*p改变了a的值之后小心地取a的值。

解决方法有两种:

(1)关闭编译优化

(2)强制要求编译器每次都要“小心地”取a的值,不要因为a是const就用a以前的值来代替,即将 const int a = 10改成volatile const int a = 10;

在这里我采用第二种,用volatile关键词限定。

代码如下:

#include <stdio.h>

int main(int argc, char const *argv[])
{
	volatile const int intNum = 10;
	int *pToIntNum = (int *)&intNum;

	*pToIntNum = 100;

	printf("&a = %p\n",&intNum);
	printf("a = %d\n",intNum);

	printf("p = %p\n",pToIntNum);
	printf("*p = %d\n",*pToIntNum);

	return 0;
}
通过原来的编译器编译,结果如下:

附注:这种方法可以通过对部分升级游戏进行逆向工程后随意更改你的等级,当然前提是你会逆向工程。




版权声明:本文为博主原创文章,未经博主允许不得转载。

常量const详解

const是C++中的一个关键字,为什么会有const呢?主要是为了弥补因宏define产生的一些语法的错误。众所周知,define就是传统的宏定义,将某些常量赋值给一个变量,但由于宏定义在编译过程中...
  • xuexiopencv
  • xuexiopencv
  • 2016年04月22日 11:26
  • 727

const常量引用的使用方法

C++编程语言中,对于常量的引用是一个非常重要的应用技巧。在这篇文章中,我们将会为大家详细介绍一下有关C++常量引用的相关应用方法,相信大家可以从中学到很多知识。 C++单例模式基础内容详解C++...
  • yusiguyuan
  • yusiguyuan
  • 2014年11月27日 21:07
  • 2901

C++ const常量值的修改

是不是const的常量值一定不可以被修改呢?   观察以下一段代码:   通过强制类型转换,将地址赋给变量,再作修改即可以改变const常量值 以下代码中的change()函数为修改常量值的代码...
  • lingtianyulong
  • lingtianyulong
  • 2013年04月13日 13:46
  • 891

const 总结——定义常量、函数的使用

C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。 Const 是C++中常用的类型修饰符,常类型是指使用...
  • wangzhiyang925
  • wangzhiyang925
  • 2013年11月21日 11:26
  • 1861

可以被const函数修改的非const变量----mutabel

原问是mutable variables and const functions mutable variables can be altered by const functions. But w...
  • haimian520
  • haimian520
  • 2016年11月30日 01:00
  • 357

静态变量(static变量)和常量(const 类型)

在c\c++中,静态变量(static)和常量(const)很容易混淆,本文通过一点粗浅的认识,写写static和const. 常量(const 类型) const类型的值是不能被修改的,...
  • Aoulun
  • Aoulun
  • 2016年12月01日 20:38
  • 1763

const常量用extern声明定义的问题

test.h #ifndef TEST_H_ #define TEST1_H //常量声明和定义采取这种方法即可 const int a = 20; //不报错,因为const变量链接属性默认是内...
  • bladeandmaster88
  • bladeandmaster88
  • 2017年03月22日 11:43
  • 625

const变量真的不能修改吗?

昨天在写程序时,突然想到了一个问题:const变量真的不可改变吗?如果能改,应该怎么改?于是乎,就决定动手操作一番,结果程序的结果有点出乎意料。但是最终还是得出了结论。如有不妥,欢迎各位拍砖! 下面...
  • jhg1204
  • jhg1204
  • 2013年05月29日 15:49
  • 2398

关于常量修饰符 const

一直对const的理解就是简单的常量修饰符,定义一个不可改变的变量【注意这里是变量,也就是说const叫常量修饰符,但实际上它定义的是一个变量,只不过由编译器限定未不可修改】。         后来听...
  • ima_zhan
  • ima_zhan
  • 2016年06月28日 21:49
  • 715

const常量和#define宏常量的区别

C++可以用const定义常量,也可以使用#define来定义常量,但是前者比后者有更多的优点: 1,const常量有数据类型,而宏常量没有数据类型,编译器可以对前者进行静态类型安全检查,而对后者只...
  • lifengguo_njupt
  • lifengguo_njupt
  • 2012年09月18日 16:38
  • 2013
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:改变const限定的“常量”
举报原因:
原因补充:

(最多只允许输入30个字)