首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

一个奇怪的有关问题,大家进来讨论

2012-01-30 
一个奇怪的问题,大家进来讨论!新建一个控制台项目,在主cpp中输入以下内容:#includestdafx.h #includeio

一个奇怪的问题,大家进来讨论!
新建一个控制台项目,在主cpp中输入以下内容:

#include   "stdafx.h "
#include   <iostream>
using   namespace   std;   //注意,如果不是vc7,头文件的引用可能与此不同

int   main(int   argc)
{
const   int   i   =   108;
int   *p   =   (int   *)&i;

*p   =   109;

cout   < <   "address   of   i: "   < <   &i   < <   endl;     //i的地址
cout   < <   "address   of   p: "   < <   p   < <   endl;       //p所指向的地址
cout   < <   "i     =   "   < <   i   < <   endl;                       //i的内容
cout   < <   "*p   =   "   < <   *p   < <   endl;                     //p指向的内容

system( "pause ");
return   0;
}

结果如下:
address   of   i:0013FED4
address   of   p:0013FED4
i     =   108
*p   =   109

奇怪的是,明明i和p的地址相同,但他们的值却不同??

[解决办法]
#include "stdafx.h "


int _tmain(int argc, _TCHAR* argv[])
{
00413350 push ebp
00413351 mov ebp,esp
00413353 sub esp,0D8h
00413359 push ebx
0041335A push esi
0041335B push edi
0041335C lea edi,[ebp-0D8h]
00413362 mov ecx,36h
00413367 mov eax,0CCCCCCCCh
0041336C rep stos dword ptr es:[edi]
const int i = 108;
0041336E mov dword ptr [i],6Ch
int *p = (int *)&i;
00413375 lea eax,[i]
00413378 mov dword ptr [p],eax

*p = 109;
0041337B mov eax,dword ptr [p]
0041337E mov dword ptr [eax],6Dh

printf( "address of i:%x\n ", (int)&i );
00413384 mov esi,esp
00413386 lea eax,[i]
00413389 push eax
0041338A push offset string "address of i:%x\n " (41584Ch)
0041338F call dword ptr [__imp__printf (4182B4h)]
00413395 add esp,8
00413398 cmp esi,esp
0041339A call @ILT+440(__RTC_CheckEsp) (4111BDh)
printf( "address of i:%x\n ", (int)p );
0041339F mov esi,esp
004133A1 mov eax,dword ptr [p]
004133A4 push eax
004133A5 push offset string "address of i:%x\n " (41584Ch)
004133AA call dword ptr [__imp__printf (4182B4h)]
004133B0 add esp,8
004133B3 cmp esi,esp
004133B5 call @ILT+440(__RTC_CheckEsp) (4111BDh)
printf( "i:%d\n ", i );
004133BA mov esi,esp
004133BC push 6Ch < <----------------------------------注意这里
004133BE push offset string "i:%d\n " (4156ACh)
004133C3 call dword ptr [__imp__printf (4182B4h)]
004133C9 add esp,8
004133CC cmp esi,esp
004133CE call @ILT+440(__RTC_CheckEsp) (4111BDh)
printf( "*p:%d\n ", *p );
004133D3 mov esi,esp
004133D5 mov eax,dword ptr [p]
004133D8 mov ecx,dword ptr [eax]
004133DA push ecx
004133DB push offset string "*p:%d\n " (4156A4h)


004133E0 call dword ptr [__imp__printf (4182B4h)]
004133E6 add esp,8
004133E9 cmp esi,esp
004133EB call @ILT+440(__RTC_CheckEsp) (4111BDh)

return 0;
004133F0 xor eax,eax
}
[解决办法]
阴魂不散,老有人搞这种事。
经过编译器处理后,你的代码相当于这样了:
cout < < "i = " < < 108 < < endl; //i的内容
cout < < "*p = " < < *p < < endl; //p指向的内容

热点排行