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;
    }
  • 相关阅读:
    互联网产品经理入门知识
    ceph的架构和概念学习
    使用cephadm安装ceph octopus
    split命令,文件切割
    openssh升级到8.4版本
    Shell写一个显示目录结构
    nsenter 工具的使用
    『Spring Boot 2.4新特性』减少95%内存占用
    Dubbo 一篇文章就够了:从入门到实战
    for update 和 rowid 的区别
  • 原文地址:https://www.cnblogs.com/matrix-r/p/5103778.html
Copyright © 2011-2022 走看看