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;
}

 

posted @ 2016-01-05 21:04  Matrix_R  阅读(467)  评论(0编辑  收藏  举报