社区
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不同。为什么?
...全文
332
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
作业
写回复
配置赞助广告
用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)
Linux——多线程以及多线程并发访问
同一
块内存
的问题
前言 之前我们学习了线程库内置函数的一些使用,接下来我们来讨论多线程在并发执行过程
中
的一些问题,我们采取访问
同一
块内存
的方式来探究。 验证思路 对
同一
个全局变量(初始
值
为0),使用五个线程函数进行++操作,每个线程函数++1000次,因此,我们5个线程就应该++5000次,最后该全局变量的
值
应该为5000。 然而
不同
次的尝试执行,却发现最终wg的
值
有时候是5000,有时候又是4997,4998。 原因是: 我们对wg++,并不是原子操作,转换为指令,有多条指令构成,计算机执行的二进制的指令对变量的自增这一
Python
不同
变量 相同
值
会指向
同一
个内存
出于对性能的考虑,在python IDLE
中
,数字位于[-5,256],和所有的字符串,
值
相同的,
不同
变量会指向
同一
个内存。 >>> c=257 >>> d=257 >>> c is d False >>> c=256 >>> d=256 >>> c is d True >>> c=-5 >>> d=-5 >>> c is d True #下面是
不要将两个指针变量指向
同一
块动态内存
不要将两个指针变量指向
同一
块动态内存。这个容易引起很严重的问题。如果将两个指针变量指向
同一
块动态内存,而其
中
一个生命期结束释放了该动态内存,这个时候就会出现问题,另一个指针所指向的地址虽然被释放了但该指针并不等于NULL,这就是所谓的悬垂指针错误,这种错误很难被察觉,而且非常严重,因为这时该指针的
值
是随机的,可能指向一个系统内存而导致程序崩溃。但也就是因为
值
是随机的,所以运行程序时有时正常有时崩溃
C++ 重复释放
同一
块内存
空间没有报错的思考
是因为重复使用delete删除相同的内存空间,但编译器竟然没有报错,所以开始了一系列关于内存空间的尝试和思考。 1. 内存空间被释放,不代表存储的内容被删除。 一
块内存
被delete后,只是从是否可以被再次分配的意义上进行了释放,其
中
原先存储的内容不会立刻被抹除。可以简单写代码验证如下: int main() { int *a1 = new int(3); cout << "*a1 = " << *a1 << endl; delete a1
多线程是可以同时读取
同一
个内存数据的
记录一下: 多线程如果只是读取
同一
块内存
区域的数据,没必要设置成同步线程,线程同步的目的是为了防止
同一
时间多个线程要修改数据,造成数据错误。所以:如果线程只是访问,完全没必要线程同步 ...
C++ 语言
65,187
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章