社区
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不同。为什么?
...全文
328
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
fireinsky
2005-11-24
打赏
举报
回复
不错,学习!
iseatoo
2005-11-24
打赏
举报
回复
又学了一点知识,哈哈
fiftymetre
2005-11-23
打赏
举报
回复
编译器帮你做了大部分工作了。你看看深入探索C++对像模型吧
晨星
2005-11-23
打赏
举报
回复
还是楼上说得严密,学习一下。:)
bineon
2005-11-23
打赏
举报
回复
呵呵。还是不懂。
&i 和p相等,不管你怎么说,那么都表示相同的内存空间,那么,很明显,i和*p理应是相同内存空间的值。
加载更多回复(8)
C++ 11 14 17 20内存管理-指针、智能指针和内存池
课程简介C++ 11 14 17 20内存管理-指针、智能指针和内存池从基础到实战学习计划1. 每天学习一小时以上2. 跟着视频动手编写代码3. 调试代码并对比课程多提供的源码课程目标1. 理解指针原理并学会智能指针和编程2. 理解c++17内存池技术3. 理解c++11 14 17 20 内存相关特性4. 拥有应用智能指针和内存池的实战的能力
不要将两个指针变量指向
同一
块动态内存
不要将两个指针变量指向
同一
块动态内存。这个容易引起很严重的问题。如果将两个指针变量指向
同一
块动态内存,而其
中
一个生命期结束释放了该动态内存,这个时候就会出现问题,另一个指针所指向的地址虽然被释放了但该指针并不等于NULL,这就是所谓的悬垂指针错误,这种错误很难被察觉,而且非常严重,因为这时该指针的
值
是随机的,可能指向一个系统内存而导致程序崩溃。但也就是因为
值
是随机的,所以运行程序时有时正常有时崩溃
多线程是可以同时读取
同一
个内存数据的
记录一下: 多线程如果只是读取
同一
块内存
区域的数据,没必要设置成同步线程,线程同步的目的是为了防止
同一
时间多个线程要修改数据,造成数据错误。所以:如果线程只是访问,完全没必要线程同步 ...
共享内存实现原理
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个
不同
进程A、B共享内存的意思是,
同一
块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存
中
数据的更新,反之亦然。由于多个进程共享
同一
块内存
区域,必然需要某种同步机制,互斥锁和信号量都可以。 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和
为什么说Python采用的是基于
值
的内存管理模式?
Python
中
的变量并不直接存储
值
,而是存储了
值
的内存地址或者引用,假如为
不同
变量赋
值
为相同
值
,这个
值
在内存
中
只有一份,多个变量指向
同一
块内存
地址。 对于C语言来讲,我们创建一个变量A时就会为为该变量申请一个内存空间,并将变量
值
放入该空间
中
,当将该变量赋给另一变量B时会为B申请一个新的内存空间,并将变量
值
放入到B的内存空间
中
,这也是为什么A和B的指针不一致的原因 例如: x=100 y=x...
C++ 语言
64,281
社区成员
250,470
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章