改变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限定修饰符的各种用法,都已经过vs2010测试。 1)  声明及初始化const常量。 在声明一个const常量时,必须对其初始化,否则会报错。 1 const in...

编写一个程序以确定分别由signed及unsigned限定的char、short、int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现

采用打印标准头文件中的相应值: #include #include //determine ranges of types int main() { printf("采用打印标准头文件limits...

指针常量与常指针CONST

  • 2010年06月14日 12:43
  • 296B
  • 下载

练习2-1 编写一个程序以确定分别由signed及unsigend限定的char short int 与long类型变量的取值范围

练习2-1 编写一个程序以确定分别由signed及unsigend限定的char short int 与long类型变量的取值范围 方法1 打印标准头文件中的响应值 #include #incl...
  • taolusi
  • taolusi
  • 2016年08月23日 16:03
  • 1077

java编程思想读书笔记 第十五章 泛型(自限定的类型)

1. 自限定的类型 在java泛型中,经常会出现如下的泛型写法:class SelfBounded SelfBounded类接受泛型参数T,而T由一个边界类限定,这个边界就是拥有T作为其参数的Sel...

linux下的select简直太奇葩了:1024限定的不只是监听的个数,还是文件描述符的最大值,注意,是值

转自:http://m.blog.csdn.net/blog/wuzili1234/12450451 我原来自以为对select就算不熟,基本原理和使用方法也略知一二了,做了一年多的服务...

获取类的完全限定的类型

  • 2011年11月06日 11:01
  • 10KB
  • 下载

类中静态变量与const常量成员的初始化

//类中,静态变量与const常量的赋值: //static 成员在类外初始化 //const 成员(及引用成员)在类的构造函数初始化列表中初始化 //static const /cons...

C++高级进阶 第四季:const详解(二) 常量折叠

一、文章来由const详解之二二、const 代替 #defineconst最初动机就是代替 #define。const 优于 #define: (1) #define没有类型检查,const在编译...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:改变const限定的“常量”
举报原因:
原因补充:

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