码迷,mamicode.com
首页 > 其他好文 > 详细

C调用栈重温

时间:2016-01-05 22:45:15      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:

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

 

C调用栈重温

标签:

原文地址:http://www.cnblogs.com/matrix-r/p/5103778.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!