|
|
发表于 2012-7-19 12:20:39
|
显示全部楼层
int * x ;
*x = 5;
汇编代码 (VC++6.0 debug)
00401054 8B 45 EC mov eax,dword ptr [ebp-14h]
00401057 C7 00 05 00 00 00 mov dword ptr [eax],5
这里你可以看到,是先把x即([ebp-14h])的值给了eax,然后 把5放到[eax]里面,因为这里x没有初始值,运行的话肯定会报错。
下面看你的
class 那样的话 定义一个你那样的类,然后在主函数里面调用的话汇编代码如下:
00401054 8D 4D EC lea ecx,[ebp-14h]
00401057 E8 B3 FF FF FF call @ILT+10(AA::A) (0040100f)
这里lea ecx,[ebp - 14h] 是寄存器传参,lea 指令说明传过去的时候 x的地址,然后看你的方法函数内部汇编:
0040147A 89 4D FC mov dword ptr [ebp-4],ecx
13: *x = 5;
0040147D 8B 45 FC mov eax,dword ptr [ebp-4]
00401480 8B 08 mov ecx,dword ptr [eax]
00401482 C7 01 05 00 00 00 mov dword ptr [ecx],5
这里是不是很清晰? 因为前面说了参数放在ecx,所以ecx里面放的x的地址,若你会汇编,我觉得这些都能看懂吧。。。
还有我不晓得你问的问题到底是为了问什么,你的那两种写法编译都能通过,执行的时候都是会报内存读写错误,申请内存的话不会。。。。。原因就是 int *x 这里没有对x进行初始化,然后后面直接*x,因为x的值位系统随机值,debug版本下是0xcccccccc, 这个地址你没有访问权限,所以执行错误,若是你把x初始化为一个有效的地址,例如0x12ff7c ,就不会有事。。。当然申请内存的话也肯定不会报错,申请内存跟你初始化是一个道理,其实,就是找了一个、你可以访问的地址。。。一个是自己可以安排,一个是系统帮你分配
|
|