关于引用的问题,不是入门问题,求教!

时间:2008-05-12 13:48:32   来源:论坛整理  作者:  编辑:chinaitzhe
用eclipse,cdt做开发。发现一个问题。

函数定义: int A(int & b){b=2-1;/*cout < <b < <endl;*/return 1;}.
调用: main()
{
int b=0;
A(b);
}
这样的情况,在debug调试时,发现在变量察看窗口和表达式察看窗口中,函数A中b的值一直显示初始化值0 。但假如
A中用cout显示来显示的话,b是实际值。返回到main的栈空间中后调试窗口中b值显示正常。

我本来认为,变量察看窗口等,察看,显示的是一个函数的栈内部的变量,但引用的变量,分配的空间应仍在定义出 ,即main中,所以不能产看 。但 想想 ,传入指针不也是一样吗?为什么能正常显示?
希高手解小弟之惑。并深入谈谈引用,比如函数是如A是如何找到A的等等。





网友回复:b= 2-1;
该语句执行完,b的值就会被修改成1


函数是如A是如何找到A的等等
--
没看明白
网友回复:不要过于相信debug的watch功能。一切以打印得到的为准。
网友回复:用不是入门问题来吓我们啊?

明显是你看错了,或者没搞清楚观察的时机

我在VC6下调试时,看到运行到A()中的赋值语句时b已经是1了.


反汇编窗口中代码如下:

Assembly code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





6:     int A(int& b)

7:     {

00401560   push        ebp

00401561   mov         ebp,esp

00401563   sub         esp,40h

00401566   push        ebx

00401567   push        esi

00401568   push        edi

00401569   lea         edi,[ebp-40h]

0040156C   mov         ecx,10h

00401571   mov         eax,0CCCCCCCCh

00401576   rep stos    dword ptr [edi]

8:         b=2-1;

00401578   mov         eax,dword ptr [ebp 8]

0040157B   mov         dword ptr [eax],1

9:         cout <<b ;

00401581   mov         ecx,dword ptr [ebp 8]

00401584   mov         edx,dword ptr [ecx]

00401586   push        edx

00401587   mov         ecx,offset std::cout (0047be90)

0040158C   call        @ILT 250(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010ff)

10:        cout <<endl;

00401591   push        offset @ILT 195(std::endl) (004010c8)

00401596   mov         ecx,offset std::cout (0047be90)

0040159B   call        @ILT 475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)

11:        return   1;

004015A0   mov         eax,1

12:    }\



14:    void main()

15:    {

004015D0   push        ebp

004015D1   mov         ebp,esp

004015D3   sub         esp,44h

004015D6   push        ebx

004015D7   push        esi

004015D8   push        edi

004015D9   lea         edi,[ebp-44h]

004015DC   mov         ecx,11h

004015E1   mov         eax,0CCCCCCCCh

004015E6   rep stos    dword ptr [edi]

16:        int  b=0;

004015E8   mov         dword ptr [ebp-4],0

17:        A(b);

004015EF   lea         eax,[ebp-4]

004015F2   push        eax

004015F3   call        @ILT 495(A) (004011f4)

004015F8   add         esp,4

18:    }









==================================
注重到main()中:

16: int b=0;
004015E8 mov dword ptr [ebp-4],0

这说明b的地址是ebp-4, b被初始化为0.

=======================================
调用A(b):

17: A(b);
004015EF lea eax,[ebp-4]
004015F2 push eax
004015F3 call @ILT 495(A) (004011f4)
004015F8 add esp,4

lea eax,[ebp-4] 就是将b的地址放到eax中.
push eax 就是将b的地址当参数,这也说明引用参数实际上就是个地址
call @ILT 495(A) (004011f4) 调用函数A()
===================================================
A()中:

8: b=2-1;
00401578 mov eax,dword ptr [ebp 8]
0040157B mov dword ptr [eax],1

mov eax,dword ptr [ebp 8]
ebp 8里面的就是b的地址,这句把b的地址放到eax
mov dword ptr [eax],1
这句把1放到eax里面的地址指向的内存中,也就是放到b中

>>>>>
很明显,执行了mov dword ptr [eax],1 后,b就变成了1.
你观察一直是0肯定是自己搞错了什么.
关键字:引用,问题,入门,问题,求教,

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面