微软的BUG,请来看看!

loveghb 2005-06-22 01:55:26
可能不是BUG,但是我觉得很奇怪,有谁能告诉我为什么?

#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
const int a(9);
const int * p;
p=const_cast<int *>(&a);
cout << "a=" << a << " before modify" << endl;
cout << "*p=" << *p << " before modify" << endl;
cout << "address of a=" << &a << " before modify" << endl;
cout << "p=" << p << " before modify" << endl << endl;

*const_cast<int *>(&a)=111;
cout << "a=" << a << " before modify" << endl;
cout << "*p=" << *p << " before modify" << endl;
cout << "address of a=" << &a << " before modify" << endl;
cout << "p=" << p << " before modify" << endl;

return 0;
}

请注意,修改后,*p 和 a 打印出来的值竟然不一样,如果在*const_cast<int *>(&a)=111;出设置一个断点,你可以发现在此句前后,调试里a的值是不一样的。

求教!谢谢
再问,如何给一个const的常量赋值?可以吗?
...全文
142 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
askppp 2005-06-22
  • 打赏
  • 举报
回复
同意icansaymyabc的观点,windows内存都是有权限的,只读,可写,可执行

不过只读区域是可以修改成为可写的

VirtualProtectEx

he_sl 2005-06-22
  • 打赏
  • 举报
回复
——》当你想写它的时候,如果内存是只读的,就把数据copy到另一个可写的内存里去
有没有办法看到它写到哪里去了?
loveghb 2005-06-22
  • 打赏
  • 举报
回复
学习了。结帖
icansaymyabc 2005-06-22
  • 打赏
  • 举报
回复
当然不是BUG。
在Windows NT下无论如何不可能给 const 变量赋值的。因为这种变量位于只读内存区。就像写保护的软盘一样,软件不可能对它有所改变。

而一个指向该只读内存的指针却不同。它所代表的变量有 COPY_ON_Write 属性。就是说,当你想写它的时候,如果内存是只读的,就把数据copy到另一个可写的内存里去,通过地址映射,面向用户的地址却不变。

当然,这种机制只在WINdows下起作用。如果你那段代码运行在DOS下,就会输出你期望的结果,因为DOS没有内存保护机制。

在windows下你非要变态得一定要把一个变量定义成const又要去改它的值的话,也不是没办法。你必须改变那个变量所在的内存的那一页的属性使得它可读写,该掉该值后,恢复其只读属性。


loveghb 2005-06-22
  • 打赏
  • 举报
回复
Robinhoodgood(Steven)
老大,没仔细看就别乱说,我用p指针去修改a的值了。管他用什么替换的,问题是我调试的时候在监视器确实看到a的值从9变成111了,但是cout出来的还是111
说话前摆脱仔细看下,谢谢
KevinWon 2005-06-22
  • 打赏
  • 举报
回复
这种情况即使看反汇编也是没有头绪 MSDN里面有说的 这样的赋值将造成不可预料的结果 >V< 够奸的
Robinhoodgood 2005-06-22
  • 打赏
  • 举报
回复
编译的时候就已经用9 替换 a 了
既然a是常量,这样做也是合理的
loveghb 2005-06-22
  • 打赏
  • 举报
回复
*const_cast<int *>(&a)=111;
问题是如上的语句执行后,我在监视器里观察的值确实是变了,VC6和VC7都是如此。
但是实际cout出来的值却还是原来的那个。
晕了,到底能不能改呢?如何改?是不是微软的调试器有问题?
vcmute 2005-06-22
  • 打赏
  • 举报
回复
汇编的时候,直接push 9
00401482 mov ebx,esp
00401484 push 9
00401486 mov eax,esp
vcmute 2005-06-22
  • 打赏
  • 举报
回复
看错了,sorry
以前修改常字符串的时候也运到这个问题,感觉是优化的问题
vcmute 2005-06-22
  • 打赏
  • 举报
回复
const int a=9;
结果相反,呵呵
loveghb 2005-06-22
  • 打赏
  • 举报
回复
自己先顶一个。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧