void fun(char param[])
{
printf("%s\n", param); // 这里取得是传入的参数 的存储地址
printf("%s\n", ¶m); // 这里取得是传入的参数 的堆栈地址
}
int _tmain(int argc, _TCHAR* argv[])
{
char arr[100] = "Hello";
printf("%s\n", arr);
printf("%s\n", &arr); // arr是局部变量 地址固定
fun(arr);
return 0;
}
main函数中反汇编: printf("%s\n", arr);
0030141B mov esi,esp
0030141D lea eax,[arr]
00301420 push eax
00301421 push 305860h
00301426 call dword ptr ds:[3092C8h]
0030142C add esp,8
0030142F cmp esi,esp
00301431 call __RTC_CheckEsp (0301145h)
printf("%s\n", &arr);
00301436 mov esi,esp
00301438 lea eax,[arr]
0030143B push eax
0030143C push 305860h
00301441 call dword ptr ds:[3092C8h]
00301447 add esp,8
0030144A cmp esi,esp
0030144C call __RTC_CheckEsp (0301145h)
fun函数中反汇编结果: printf("%s\n", param);
00E413FE mov esi,esp
00E41400 mov eax,dword ptr [param]
00E41403 push eax
00E41404 push 0E45858h
00E41409 call dword ptr ds:[0E492C8h]
00E4140F add esp,8
00E41412 cmp esi,esp
00E41414 call __RTC_CheckEsp (0E4114Ah)
printf("%s\n", ¶m);
00E41419 mov esi,esp
00E4141B lea eax,[param]
00E4141E push eax
00E4141F push 0E45858h
00E41424 call dword ptr ds:[0E492C8h]
00E4142A add esp,8
00E4142D cmp esi,esp
00E4142F call __RTC_CheckEsp (0E4114Ah)
如果懂汇编,就不用看下边了,如果没学过,那就稍微理解一下下边这张图:
有什么问题,再讨论。
|