【发布时间】:2011-03-13 02:10:38
【问题描述】:
__cdecl 调用约定说:调用者清理堆栈。
__stdcall 调用约定说:被调用者清理堆栈。
所以我尝试测试下面的代码:
#include <...>
char *callee()
{
char str[] = "abcd";
return str;
}
int main()
{
char *str;
str = callee();
printf("%s\n", str);
return 0;
}
根据上面的两个调用约定,我认为:
__cdecl 调用者清理堆栈,所以printf("%s\n", str) 应该输出“abcd”。
__stdcall 被调用者清理堆栈,所以printf("%s\n", str) 应该输出混乱的字符。
但实际上,两个都输出杂乱的字符。我很困惑。感谢您的帮助!
【问题讨论】:
-
str在堆栈上,当callee完成时,str完成。