今天脑子里一直在想函数指针这个话题,脑子里想到了以下场景:
__stdcall int function (int)
{
return 0;
}
int main()
{
(*(int(*)(char*,char*))function)("thought", "experiment");
return 0;
}
AFAIK 这段代码会破坏堆栈,那么如果我运行这段代码,我会看到哪些类型的问题?
我会做这个调查自己,但是我已经离开我的开发机器一周了。
编辑:等一下,我想多了。正如评论中所观察到的那样,这段代码的目的是在所有事情都说完后在堆栈上留下一个参数(调用者将两个参数放在堆栈上,被调用者 - 只需要一个参数 - 只弹出一个)。然而,由于我的演员没有提到调用约定,我是否抛弃了 stdcall,至少从调用者的角度来看?int function(int)仍然会从堆栈中弹出一个参数,但是调用者是否会因为转换而恢复认为该函数是 __cdecl (默认值)?(即弹出三个参数?)
EDIT2:正如 Rob 所证实的,第二个问题的答案是肯定的。如果我想在堆栈上留下一个参数,我将不得不重述 __stdcall:
(*(__stdcall int(*)(char*,char*))function)("thought", "experiment");