函数调用过程中栈到底是怎么压入和弹出的?
比如:void fun(int a,int b,int c); 调用fun(1,2,3); 调用时: -将断点程序指针压入堆栈 -将3,2,1顺序压入堆栈,并指定参数变量指针到堆栈,参数存放位置即为参数变量位置 -压栈保存现场 -执行函数 -弹栈恢复现场 -堆栈指针减掉参数占用字节数,舍弃堆栈中的参数 -弹栈断点程序指针加上调用语句字节数继续执行
函数调用用栈还是队列?
函数调用用栈。
堆栈的先入后出式操作顺序,适用于函数的嵌套调用。队列先入先出则不适用。
比如:(堆栈的操作是在栈顶完成的)
main函数调用A函数,现场参数压栈,栈结构:【[栈顶][调用A现场][栈底]】
A函数再调用B函数后:【[栈顶][调用B现场][调用A现场][栈底]】
当从B返回时,在栈顶可以拿到刚才入栈的[调用B现场]参数,从A返回时,[调用A现场]参数这回到了栈顶,正好使用。