zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    2016年开源软件评选(截图备份)
    牛逼的思维方式都是倒逼出来的(摘)
    3-22 多态
    3 -20 类
    3 -19标准库
    3 -16 json序列化
    3 -16 内置方法
    迭代对象 和 迭代器
    3 -14 迭代 和列表 生成器
    3-13 装饰器
  • 原文地址:https://www.cnblogs.com/matrix-r/p/5103778.html
Copyright © 2011-2022 走看看