gpt4 book ai didi

c++ - 对 __cdecl 和 __stdcall 调用约定感到困惑

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:15:05 25 4
gpt4 key购买 nike

__cdecl 调用约定说:caller cleanup stack.

__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) 应该输出困惑的字符。

但实际上,两个输出的都是乱七八糟的字符。我很迷惑。感谢您的帮助!

最佳答案

“清理堆栈”实际上意味着“调整堆栈指针,使其与参数和返回地址被压入堆栈时对堆栈指针所做的更改相匹配”。在你的例子中,谁清理堆栈是无关紧要的——你会得到相同的未定义行为,因为你试图访问一个堆栈分配的变量,该变量被一系列后来执行 printf( )

如果您只用 C 或 C++ 编写代码,那么您不应该关心诸如“谁清理堆栈”之类的确切细节——这些细节只有在用汇编语言编写时才是关键的。在 C 和 C++ 中,只需确保在通过这些指针调用函数之前使用正确的调用约定标记函数指针,编译器将完成其余工作。

关于c++ - 对 __cdecl 和 __stdcall 调用约定感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5195971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com