一个C++返回值的问题
2007-04-10 20:20
288 查看
这周一个同学问我一个C++问题,这个问题之前我也没有发现。问题如下:
#include <iostream>
using namespace std;
int& func()
.........{
int i = 0;
reuturn i;
}
int main()
.........{
int& a = func();
int b = func();
cout << a << " " << b << endl;
return 0;
}
在Visual C++ 6.0和Visual C++ 2005中的输出结果:
0 0
在g++中的输出结果:
0 0
同学问的时候我直接就说这个编译通不过,因为func函数返回一个局部变量的引用,便一起要报错的。但那个同学说在VC6.0下能通过,我也特别茫然,于是回来试着调了一下,发现在VC6.0下果然能输出结果。于是便开始思考这是为什么?
在VC6.0下用反汇编方式看了一下,发现了问题的答案:
6: int& func()
7: ......{
00401890 push ebp
00401891 mov ebp,esp
00401893 sub esp,44h
00401896 push ebx
00401897 push esi
00401898 push edi
00401899 lea edi,[ebp-44h]
0040189C mov ecx,11h
004018A1 mov eax,0CCCCCCCCh
004018A6 rep stos dword ptr [edi]
8: int i = 0;
004018A8 mov dword ptr [ebp-4],0
9: return i;
004018AF lea eax,[ebp-4]
10: }
004018B2 pop edi
004018B3 pop esi
004018B4 pop ebx
004018B5 mov esp,ebp
004018B7 pop ebp
004018B8 ret
12: int main(int argc, char* argv[])
13: ......{
004018D0 push ebp
004018D1 mov ebp,esp
004018D3 sub esp,48h
004018D6 push ebx
004018D7 push esi
004018D8 push edi
004018D9 lea edi,[ebp-48h]
004018DC mov ecx,12h
004018E1 mov eax,0CCCCCCCCh
004018E6 rep stos dword ptr [edi]
14: int& a = func();
004018E8 call @ILT+525(func) (00401212)
004018ED mov dword ptr [ebp-4],eax
15: int b = func();
004018F0 call @ILT+525(func) (00401212)
004018F5 mov eax,dword ptr [eax]
004018F7 mov dword ptr [ebp-8],eax
我们看第9行return i后有一行汇编代码lea eax,[ebp-4],这行代码正好将变量i的值返传给了eax,然后在第14行的mov dword ptr [ebp-4],eax,这行代码有讲eax的值传给了a,于是func函数中的局部变量i的值就被返回了。这是我自己的看法,希望大家来讨论,如果不对,请一定要告诉我。谢谢!
#include <iostream>
using namespace std;
int& func()
.........{
int i = 0;
reuturn i;
}
int main()
.........{
int& a = func();
int b = func();
cout << a << " " << b << endl;
return 0;
}
在Visual C++ 6.0和Visual C++ 2005中的输出结果:
0 0
在g++中的输出结果:
0 0
同学问的时候我直接就说这个编译通不过,因为func函数返回一个局部变量的引用,便一起要报错的。但那个同学说在VC6.0下能通过,我也特别茫然,于是回来试着调了一下,发现在VC6.0下果然能输出结果。于是便开始思考这是为什么?
在VC6.0下用反汇编方式看了一下,发现了问题的答案:
6: int& func()
7: ......{
00401890 push ebp
00401891 mov ebp,esp
00401893 sub esp,44h
00401896 push ebx
00401897 push esi
00401898 push edi
00401899 lea edi,[ebp-44h]
0040189C mov ecx,11h
004018A1 mov eax,0CCCCCCCCh
004018A6 rep stos dword ptr [edi]
8: int i = 0;
004018A8 mov dword ptr [ebp-4],0
9: return i;
004018AF lea eax,[ebp-4]
10: }
004018B2 pop edi
004018B3 pop esi
004018B4 pop ebx
004018B5 mov esp,ebp
004018B7 pop ebp
004018B8 ret
12: int main(int argc, char* argv[])
13: ......{
004018D0 push ebp
004018D1 mov ebp,esp
004018D3 sub esp,48h
004018D6 push ebx
004018D7 push esi
004018D8 push edi
004018D9 lea edi,[ebp-48h]
004018DC mov ecx,12h
004018E1 mov eax,0CCCCCCCCh
004018E6 rep stos dword ptr [edi]
14: int& a = func();
004018E8 call @ILT+525(func) (00401212)
004018ED mov dword ptr [ebp-4],eax
15: int b = func();
004018F0 call @ILT+525(func) (00401212)
004018F5 mov eax,dword ptr [eax]
004018F7 mov dword ptr [ebp-8],eax
我们看第9行return i后有一行汇编代码lea eax,[ebp-4],这行代码正好将变量i的值返传给了eax,然后在第14行的mov dword ptr [ebp-4],eax,这行代码有讲eax的值传给了a,于是func函数中的局部变量i的值就被返回了。这是我自己的看法,希望大家来讨论,如果不对,请一定要告诉我。谢谢!
相关文章推荐
- C++中用函数返回值初始类对象时的一个问题
- C++中用函数返回值初始类对象时的一个问题
- C++中用函数返回值初始类对象时的一个问题
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
- 解答一个C++问题
- c++中定义一个全局变量,子函数修改变量后,主函数没有改变问题
- 关于解决c++的一个古怪问题(转)
- 一个C++模板的问题,VC6.0通过, GCC不能通过!!
- C++字符数组越界问题的一个案例分…
- 有关C++参数传值的一个问题探讨
- 一个C++小题目引出的问题
- 今天在看一些面试题的时候遇到的一个关于strcmp()返回值的细节问题
- 一个C++代码DEBUG时跳到错误的函数中的怪问题
- C++ SQLite安装与使用,以及一个问题解决
- 浅谈C++中内存分配、函数调用和返回值问题
- Win32 C++工程中使用离屏面碰到的一个奇怪问题
- c++的getline一个关于缓冲区的一个小问题
- C++库研究笔记——使用函数模板还是类模板?+ 一个类型重复问题的两种解决方法
- 浅谈C++中内存分配、函数调用和返回值问题
- 浅谈C++中内存分配、函数调用和返回值问题