一、函数的堆栈调用
1. 汇编语言:
2. 通过底层汇编发现,在开新的函数栈里面的局部变量会被全部赋为cccc ccccc,所以局部变量/指针不可以不赋值,一旦不赋值,则会被赋成ccccc cccc,从而出现访问内核地址导致程序崩溃
3. C/C++入栈的顺序是从右向左(原因:为了确定形参的个数)
4. 函数的返回值最终由寄存器带回
对于非类类型的:
返回值>8,由调用方中的临时量带回
5. 在函数调用完之后回到main函数的原因:
开始调用函数前就将main函数栈底地址压入栈中,调用完成之后从而返回main函数
6. 向main函数栈桢后为什么从当前位置开始执行:
因为main函数的下一条指令被压入栈中
7. 形参 ----》 实参的过程
在形参压栈后,压入临时量的地址
8. 形参是否开辟内存,在哪开辟
形参开辟内存,由调用方main函数开辟,调用方清理
二、调用约定
1. 类型:_cdecall (c标准调用约定)
_stdcall (windows的标准调用约定)
_fastcall (快速调用约定)
_thiscall (c++的成员方法的调用约定)
2. 作用
(1)影响符号的生成规则
(2)决定形参入栈的顺序
(3)影响形参的开辟和清理方式
_cdecall:调用方开辟,调用方清理
_stdcall:调用方开辟,被调用方清理
_fastcal:形参不开辟内存,有寄存器带入被调用方
(形参个数过多:第三个形参由调用方开辟,被调用方清理)
三、空函数还会预留开栈,清栈后值不改变,只是表示内存可以再分配
补充:一定不要返回局部变量的地址,因为清栈后的内存会重新被分配,局部变量会被修改