大家来看一段好玩的代码
,并想想为什么。
[解决办法]
#include <iostream>
#include <cstdlib>
using namespace std;
void a()
{
printf("Hello World!\n");
}
int main()
{
typedef int (*fun)();
fun tmp = (fun)a;
printf("0x%x\t0x%x\n",tmp,&a);
if(tmp())
{
printf("a is ok!\n");
}
else
{
printf("a is not ok!\n");
}
system("pause");
}
其实void函数和其他类型的函数是一样的,也有返回值,只是编译器没有取它的返回值而已,返回值一般存在eax里面,a跳进去后,至少会调用一个printf,printf里面肯定会用到eax,至于是不是0就不知道了,如果编译器在最后加xor eax,eax,那返回值就是0,但是这个不是,至少用vc不是,printf结束后eax里面的值是0x0D,所以返回了0x0D。上面的就会输出a is ok!
不过这种不确定的,了解就好,没什么实际意义。