in cmainframe::cmainframe()
{ int a = 1,b=2,c=3;
int* p;
memcpy(&p+4,&b,4);
}
_DEBUG下出错,RELEASE不出错。
memcpy执行后,this指针变成2了,为什么?
我发现stack是从高地址到低地址的,&p+4就是c的地址,但memcpy后,c的值没有变成2,为什么?memcpy到底在什么地方写入了4字节的什么内容?
{ int a = 1,b=2,c=3;
int* p;
memcpy(&p+4,&b,4);
}
_DEBUG下出错,RELEASE不出错。
memcpy执行后,this指针变成2了,为什么?
我发现stack是从高地址到低地址的,&p+4就是c的地址,但memcpy后,c的值没有变成2,为什么?memcpy到底在什么地方写入了4字节的什么内容?
解决方案 »
- 入门级问题 如何使用SDK弹出一个File Dialog 最简单的就可以了 谢谢
- Socket编程初学~~
- MFC中如何重载全局的operator new
- Greta使用问题(编译问题)
- 如何拖动按钮
- 如何确定Bitmap是2字节对齐还是四字节对奇?
- 忧闷啊!计算机编程的东西太多了,好象学不完似的,又有问题向这里的前辈请教了!一个关于用对话框捕捉数据的问题。(请进)
- 怎样在CFormView的派生类中初始化“树”
- who know?
- 在ASP中创建了COM对象,但如何获得它的第二个接口呢???
- MFC中为控件添加消息处理函数时遇到了问题
- 用CMSComm串口类,在dlg里添加OnComm(),如何在此函数里只处理一次事件??
int* p;
memcpy(&p+4,&b,4);说真的,看不懂你这写的什么,是不是错的太多了```
1.p指针没有给初值,
2.p的指针地址做什么用~??
memcpy执行后,this指针变成2了,为什么?在Debug下, 结果与你说的一致 int a = 1,b=2,c=3;
在Release下代码优化后 a, c 变量没有使用, 被编译器删除
变量b为常量, 被常量替换, 变量b也不存在了in cmainframe::cmainframe()
类构造函数 会对this指针操作, 可能会用到this指针, 可能把b就写入到this, 所以成2memcpy到底在什么地方写入了4字节的什么内容?
这问题有很大的不确定性
&a = 0x0012f9dc, &b = 0x0012f9d0, &c = 0x0012f9c4, &p = 0x0012f8b8, &this = 0x0012f9e8, 那么可以推算出&p+4 = 0x0012f9c8,而这个地址也并不是this指针的地址,也不是c的地址。
在不同的编译器和不同的编译环境,结果相同的概率几乎为0。对于这种不确定的问题,就没有讨论的必要了。
&a = 0x0012f9dc, &b = 0x0012f9d0, &c = 0x0012f9c4, &p = 0x0012f8b8, &this = 0x0012f9e8,我的是:
&a = 0x0012fe28,&b = 0x0012fe24, &c = 0x0012fe20, &p = 0012fe1c,&p+4 = 0x0012fe20,
以4字节为单位,而他的怎么会是以12字节为单位呢?sizeof(int)应该是4。
那么你改成memcpy(&p+12,&b,4)看看,c的值会不会改变?
而lz那种情况里面则就是0x0...20,也就是直接加4的结果,因为这里&p取得是一个地址,而给这个地址单纯加4就不会像int那样计算,可以试下直接&(p+4),编译器就慌了,因为不知道是啥,本来就没分配这个东西~~~~~,当然,更重要的个原因就是他用的vc6
而ls估计用的vs 2005
2005我前几天刚用,根本闹不明白
不过lz的那个在2005上倒是没太大问题,按ls给的地址,memecpy自己肯定是不成了,那就改为
&p+3吧,然后发现...,c的value变了,而且是拷贝了4个b,而不是4字节,也就是说,得改成
memcpy(&p+3,b,1),这样,c就变成2了........(*@&#)(*@&#)(@*&#,就是说要是memcpy(&p+3,b,4)的话,c就变成了0x02020202.........
虽然的确是lz写的不对,编译器不同,开关不同也造成了不可预知的情况,但是这个... ...
而在使用&p+4的时候就不一样,vc6是直接加上4,而我用的2005则是和你的结果一样
还有,最好测试一下,别太武断
VC6加4就直接加4?虽然没有VC6可以测试,但我也绝对不信。
LZ认为是直接加4,但实际上却并不是直接加4,错误就在这里……
int* p,我把&p给理解成了int类型,实际上不是,也怪vc6的watch窗口欺骗了我,watch里的&p+4的确是在&p的基础上只加了4个字节。所以不能完全相信它。我从反汇编发现就是偏移了16字节,和watch结果不同,所以我没有搞懂。把代码改一下:
int a = 1,b = 2;
//把b的值赋值给a
int* p;
memcpy( ((char*)&p) + ((int)&a-(int)&p),&b,4);所以指针在没有初始化的情况下仍然有用途。