社区
C++ 语言
帖子详情
同一块内存中的值不同!
bineon
2005-11-23 12:50:13
#include <iostream.h>
main()
{
const int i = 10;
int * p = (int *)&i;
*p = 100;
cout << p << endl;
cout << *p << endl;
cout << &i << endl;
cout << i << endl;
getchar();
}
得到p和&i相同,但是*p和i不同。为什么?
...全文
373
28
打赏
收藏
同一块内存中的值不同!
#include main() { const int i = 10; int * p = (int *)&i; *p = 100; cout << p << endl; cout << *p << endl; cout << &i << endl; cout << i << endl; getchar(); } 得到p和&i相同,但是*p和i不同。为什么?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
28 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zl0126
2005-11-24
打赏
举报
回复
mark
uselessman
2005-11-24
打赏
举报
回复
建议大家学学汇编
类似(i++) + (i++) + (i++)之类的东西
在汇编里一目了然
happydivid
2005-11-24
打赏
举报
回复
这个问题在论坛已经提到过挺多次了。
以前的结论就是这个结果就是const常量在后面的代码中,相当于宏定义的常量,直接将常量名替换成常量值,而不是去常量名所指的地址取其值。
所以会出现上面的情况。
slovel
2005-11-24
打赏
举报
回复
我懂了,内存是100的,因为你饶开了CONST改变了I的值。但是由于你的变量本身是CONST,所以在输出的时候编译器作了优化,直接用10而不是I输出。
uselessman
2005-11-24
打赏
举报
回复
那块内存里当然是100没错
问题在于 cout<<i<<endl; 这句话执行时就压根没从内存里读东西
uselessman
2005-11-24
打赏
举报
回复
接上,我搞了一个
int nn = i;
在VC的汇编码里对应的是
mov dword ptr[ebp-8], 0Ah
这回楼主死心了吧
uselessman
2005-11-24
打赏
举报
回复
编译成.obj文件,然后debug之
找出汇编码也不难吧
我在VC里试了试,在汇编码里,你那句cout << i << endl;
i直接被替换成了0Ah
编译时就替换结束了
呵呵
slovel
2005-11-24
打赏
举报
回复
学习了,MARK
晨星
2005-11-24
打赏
举报
回复
哦,也不一定,既然标准没规定,编译器厂商怎么做都是对的,即使等于101也不能说编译器有问题。
晨星
2005-11-24
打赏
举报
回复
后来当然是100。
bineon
2005-11-24
打赏
举报
回复
撇开编译器优化不谈,你说那块内存中到底存的是什么?
ilovedudu
2005-11-24
打赏
举报
回复
登记
bing_huo
2005-11-24
打赏
举报
回复
8符合标准地代码 出什么结果都8奇怪。。。。
「已注销」
2005-11-24
打赏
举报
回复
main()
{
const int i = 10;
int * p = /*(int *)*/&i;
*p = 100;
cout << p << endl;
cout << *p << endl;
cout << &i << endl;
cout << i << endl;
getchar();
}
这样就是一样啦..因为你用了强制转换在那里..欺骗了编译器..
i的值是const类型的..输出来当然也是10..罗 同样*p也只能是
100..
........
yuchengliu
2005-11-24
打赏
举报
回复
7: *p = 100;
00401085 mov ecx,dword ptr [ebp-8]
00401088 mov dword ptr [ecx],64h
我发现这个值已经被改变了, 其内容中的值已变为 100
11: cout << i << endl;
004010DE push offset @ILT+10(endl) (0040100f)
004010E3 push 0Ah
004010E5 mov ecx,offset cout (0042aa40)
004010EA call ostream::operator<< (00401520)
004010EF mov ecx,eax
004010F1 call @ILT+0(ostream::operator<<) (00401005)
只是在输出的时候直接使用的是 10
adyhvgjkiyffjj
2005-11-24
打赏
举报
回复
不错,学习!
iseatoo
2005-11-24
打赏
举报
回复
又学了一点知识,哈哈
fiftymetre
2005-11-23
打赏
举报
回复
编译器帮你做了大部分工作了。你看看深入探索C++对像模型吧
晨星
2005-11-23
打赏
举报
回复
还是楼上说得严密,学习一下。:)
bineon
2005-11-23
打赏
举报
回复
呵呵。还是不懂。
&i 和p相等,不管你怎么说,那么都表示相同的内存空间,那么,很明显,i和*p理应是相同内存空间的值。
加载更多回复(8)
不同
品牌同频率同大小的内存可以混用吗?
如果对于电脑稳定性要求较高的小伙伴,建议使用同品牌同型号,甚至是同批次的内存条,一次性安装到足够使用的容量,避免后续增加内存出现兼容性问题导致系统不稳定。
JavaScript 对象赋
值
的问题,
同一
块内存
地址。
/** *对象的赋
值
,实际上声明一个指针指向
同一
块内存
地址,指针指向
同一
块内存
地址。 */ letarr={};//原始
值
leta=arr;//浅拷贝 a['key']={};//a指针指向arr,即修改了arr的
值
console.log('>>>a:',a,'>>>arr:',arr);//{'key':{}}{'key':{}} a=a['key'];/...
不要为了方便,让两个指针指向
同一
块内存
现在在修改之前写的代码,发现其
中
一个问题,示例代码如下: //Video.h class Video { public: Video(int nr, int nc); ~Video(); public: int* GetVideoData(); private: int *m_pBuff; } //Video.cpp Video::Video() { ...
如何将
不同
大小及宽度的数据,拼接在
同一
块内存
中
?
/************************************************************************* @ brief 拼接一段数据到某个地址 step1: 先定义一块地址,用于存储拼接之后的数据. 这里介绍两种方式: 一种是用malloc一段内存: char *Ptr = NULL; Ptr = (char*)malloc(100 * sizeof...
关于多指针指向
同一
块内存
的问题
有时为了逻辑实现的方便,在程序
中
会采用多指针指向
同一
块内存
的设计,但是这同时会带来问题: 问题1:容易引发“野指针”错误!即其
中
一个指针delete了内存之后,其他指针无法判断该指向地址是否还有效,如果也去delete,这时自然会导致错误。 解决方案:严格遵照 谁申请,谁释放 的原则! 问题2:即使遵守谁申请谁释放的原则,其他指针还是无法有效置为null,因为你无法判断它是否还有效,只能不去...
C++ 语言
65,212
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章