C/C++中常量修饰const可以用来保证一些确定的量不会被一不小心改变,比如PI,一直是3.14159......

但是不排除有时候也会需要修改常量的值,通过直接修改是不能达到目的。

比如:

  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. const int a = 0;
  5. a = 2;
  6. return 0;
  7. }

编译时会报错:

const1.c: In function 'main':

const1.c:5: error: assignment of read-only variable 'a'

但是,我们可以通过&找到常量a所在的地址进行修改:
  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. const int a = 1;
  5. printf("a = %d/n", a);
  6. *((int *)&a) = 2;
  7. printf("a = %d/n", a);
  8. return 0;
  9. }
当然也可以用asm的方法,效果一样, x86下是这样用的:
  1. #include <stdio.h>
  2. int main(int argc, const char *argv[])
  3. {
  4. const int a = 1;
  5. unsigned int addr = (unsigned int)&a;
  6. printf("a = %d/n", a);
  7. asm ("movl $2, %%eax;"
  8. "movl %0, %%ebx;"
  9. "movl %%eax, (%%ebx);"
  10. :"=m"(addr)
  11. :
  12. :"%eax", "%ebx");
  13. printf("a = %d/n", a);
  14. return 0;
  15. }
运行结果:
a = 1
a = 2
从结论可以猜测,gcc只是在编译时检查对常量的操作并保证不被修改,但是不能保证通过地址或其他手段修改。

C/C++修改常量的值的更多相关文章

  1. 【转】int && 非常量右值

    C++ 11中引入的右值引用正好可用于标识一个非常量右值.C++ 11中用&表示左值引用,用&&表示右值引用,如: int &&a = 10 右值引用根据其修饰 ...

  2. Cocos2D在新版Swift中常量枚举值引用代码的修改

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在SpriteBuilder中是无法直接给一个CCB文 ...

  3. C语言之修改常量

    前言:指针!菜鸟的终点,高手的起点.漫谈一些进阶之路上的趣事:记录一些语言本身的特性以及思想,没有STL,也没有API! 0x01: 程序内存中的存储划分 对于程序在内存中是如何分布的,网上有多个解释 ...

  4. Mysql 修改字段默认值

    环境:MySQL 5.7.13 问题描述:建表的时候,users_info表的role_id字段没有默认值,后期发现注册的时候,需要提供给用户一个默认角色,也就是给role_id字段一个默认值. 当前 ...

  5. C语言执行时报错“表达式必须是可修改的左值,无法从“const char [3]”转换为“char [120]” ”,原因:字符串不能直接赋值

    解决该问题的方法:使用strcpy函数进行字符串拷贝   原型声明:char *strcpy(char* dest, const char *src); 头文件:#include <string ...

  6. jquery 双击修改某项值

    双击修改某项值 $(function() { $('td.breakword').dblclick(function(){ $(this).addClass('input').html('<in ...

  7. GDB 修改当前判断函数的返回值(即修改寄存器的值)的方法

    工作中遇到的问题: 在GDB调试时要进入下边该判断后边的函数,而m_EtherDecode.Chk_MakeSure_IP_Pkt(pPacket,dwPacketLen)的返回值是false,所以需 ...

  8. c# winform TreeView NODE(节点) 重命名或获取节点修改后的值

    在程序开发过程中我们经常用到treeview,还经常要修改节点的名字.节点名字修改后还想及时更新数据库.这时问题就来了,怎样获取NODE(节点)更新后的值呢?本人试了很多方法最终分析出treeview ...

  9. jQuery设置和获取以及修改class name值操作

    在Web程序开发中.很多时候会用需要修改Html标签的class名称.来达到修改标签样式的效果.那么在代码中一般是怎么操作的呢.本文将为你详细讲解一下class的使用.在jQuery中可以使用attr ...

随机推荐

  1. 深入Blocks分析

    1.简介 从iOS4开始,苹果引入了这个C语言的扩充功能"Blocks",在一些特定的场景下也是一把利刃.我前面一篇博客中初步介绍了Blocks这个东西,主要是语法的介绍(< ...

  2. poj1663---纯粹找规律

    #include <stdio.h> #include <stdlib.h> int main() { int n; scanf("%d",&n); ...

  3. HTML5阴影与渐变

    一.阴影 阴影的效果,阴影有四个状态值控制,分别是shadowBlur,shadowOffsetX,shadowOffsetY和shadowColor.shadowBlur为阴影的像素模糊值,shad ...

  4. 前端新人学习笔记-------html/css/js基础知识点(二)

    4月7日学到的知识点:     一:<img src="1.png" alt="美女"/> alt是给图片添加介绍,当图片没加载出来时,会直接显示a ...

  5. CentOS配置ftp服务器

    1.首先更新yum 源 yum update 2. 安装vsftpd yum install vsftpd -y   // 安装    移除是 yum remove vsftpd 3. 配置Vsftp ...

  6. 尝试解决IIS问题一些方法

    尝试解决IIS问题一些方法 在控制面板中安装相关功能.添加相关角色 Win下注册IIS: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_re ...

  7. VUE中的v-if与v-show

    1.共同点 都是动态显示DOM元素 2.区别 (1)手段:v-if是动态的向DOM树内添加或者删除DOM元素:v-show是通过设置DOM元素的display样式属性控制显隐: (2)编译过程:v-i ...

  8. Fiddler [Fiddler] Connection to localhost. failed.

    原文地址:http://blog.chinaunix.net/uid-20675015-id-1899931.html 在用Fiddler调试本机的网站时,即访问http://localhost,返回 ...

  9. 一个给力的html5 画多边形的例子

    只需改变参数就能画出你想要的多边形,代码简单!不得不惊叹canvas的强大! 代码奉上 <!doctype html> <html> <head> <meta ...

  10. asp.net core + angular2 的环境配置

    国内整个对 asp.net core  和 angular2这些新出来的关注度不是太好.跟国外比很大差距. 我在试着去做这个整合的时候也碰到不少问题. 最后通过查阅大量资料才弄明白. 我想肯定也会有类 ...