函数指针和调用约定

本文介绍了函数指针的声明、赋值和调用方法,特别强调了调用约定的重要性。__cdecl、__stdcall和__fastcall三种调用约定各有特点,用于不同的场景。__cdecl是默认调用约定,由调用者清理堆栈;__stdcall适用于Windows API和DLL;__fastcall通过ECX/EDX寄存器提高效率。理解并正确使用调用约定对于防止堆栈不平衡导致的错误至关重要。
摘要由CSDN通过智能技术生成

函数指针

通常用来调用别人写的函数

// 声明方式
函数返回值 (调用约定 *变量(函数)名)(参数列表);
int (__stdcall *addFunc)(int,int);

// 给函数指针赋值
函数名 = 函数返回值 (调用约定 *)(参数列表)内存中的函数地址;
addFunc = int (__stdcall *)(int,int)0x40100(call的内存地址);

// 调用该函数
返回值 变量名 = 函数名(参数列表);
int res = addFunc(1,2);

可以自己尝试手动调用系统api函数,例如messagebox

约定调用

告诉编译器怎么传递参数,怎么传递返回值,怎么平衡堆栈

调用约定参数压栈顺序平衡堆栈应用场景
__cdecl从右到左压栈外平衡。由调用者进行平衡(例如main函数调用了一个add函数,main就是调用者)一般自己写的代码默认就是这种约定
__stdcall从右到左压栈自平衡。由函数自身平衡堆栈使用Windows提供的api ,或者自己编写dll给外部调用的时候
__fastcallECX/EDX传递前两个参数(从左往右的顺序)
剩下的参数:从右到左压栈
自平衡。由函数自身平衡堆栈需要增加函数的执行效率

要注意调用约定是否相同,堆栈不平衡程序可能会报错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值