C调用栈重温
C栈的地址是从高位地址不断忘低位地址膨胀的,最先调用的函数所处的栈地址最高,后被调用的地址在低位:
A-》H这些地址表明了表明了基本的调用关系,AB是函数入参,CD是函数内的变量。
先调用者在高地址,后调用者在低位地址。
其中参数的顺序是,在左面的参数在低位地址,右面的参数在高位地址,所以如果入参是函数的返回值形式,那么调用顺序应该是先右后左。
而函数中的变量的声明则是先声明的高位地址,后声明的参数在低位地址。
今天看同事发了一个死机问题定位时感觉自己忘得差不多,温习一下,特此记录~
函数代码如下:
#include <iostream> using namespace std; #define PRINT_ADDR(a) {cout << #a << ":" << (unsigned int)&a << ";" << "Val:" << a << endl; } void StackFounctinB ( unsigned int unParamE, unsigned int unParamF ) { unsigned int unParamG = 7; unsigned int unParamH = 8; PRINT_ADDR(unParamE); PRINT_ADDR(unParamF); PRINT_ADDR(unParamG); PRINT_ADDR(unParamH); } void StackFounctinA ( unsigned int unParamA, unsigned int unParamB ) { unsigned int unParamC = 3; unsigned int unParamD = 4; PRINT_ADDR(unParamA); PRINT_ADDR(unParamB); PRINT_ADDR(unParamC); PRINT_ADDR(unParamD); StackFounctinB ( 5, 6 ); } int main() { unsigned int unParamMainA = 10; unsigned int unParamMainB = 11; PRINT_ADDR(unParamMainA); PRINT_ADDR(unParamMainB); StackFounctinA ( 1, 2 ); return 0; }