跳至主要內容

为什么c和c++函数参数从右往左压栈?

张威大约 1 分钟c/c++c++补充

为什么c和c++函数参数从右往左压栈?

因为c/c++支持“函数参数长度可变”这个特性

可变参数函数:函数声明时参数列表有...,如printf(const char* format,…)

函数调用的过程:

  1. 将参数从右往左压栈
  2. 执行call指令,先将下一行指令的地址压栈,再进入调用函数
  3. 进入后,先将调用函数的栈底指针(即esp指针)压栈,然后再开辟栈空间

指令生成是在编译阶段生成,不知道运行时传入了几个参数,从右往左压栈,因为参数压完后又压入了下一行指令的地址以及调用函数栈底指针,因此第一个参数的位置永远是ebp+8,通过ebp的偏移依次获取其他参数

如果从左往右压栈,不知道传入参数个数,每次第一个参数的位置也是不确定的!!!

[指令角度理解堆栈调用过程 | 张威的编程学习笔记 (gitee.io)](https://iszhwei.gitee.io/ccpp/00 基础必备/指令角度堆栈调用过程.html)