函数堆栈帧中参数和局部变量的地址

时间:2016-02-26 00:55:05

标签: c stack

我正在学习c并在处理函数堆栈框架时遇到过这个问题,请考虑以下代码:

#include <stdio.h>

void function1(void* a){
   int b = 5;

   printf("para add: %p local add: %p\n", &a, &b);
}

int main(){

    function1(20);
    function1(30);
    function1(40);
    function1(50);
    function1(60);
    function1(70);

    return 0;
}

结果是:

para add: 0020FF08 local add: 0020FEFC
para add: 0020FF08 local add: 0020FEFC
para add: 0020FF08 local add: 0020FEFC
para add: 0020FF08 local add: 0020FEFC
para add: 0020FF08 local add: 0020FEFC
para add: 0020FF08 local add: 0020FEFC

我知道每个函数都有它的地址,但是每个局部变量的地址和函数中的每个参数总是一样吗?

2 个答案:

答案 0 :(得分:1)

不,它们并不总是一样的。如果堆栈用于运行程序的环境中的参数和局部变量,它可能依赖于堆栈指针。

例如,此代码在ideone.com中有不同的地址。

#include <stdio.h>

void function1(void* a){
   int b = 5;

   printf("para add: %p local add: %p\n", (void*)&a, (void*)&b);
}

void test(void) {
    int testData[100];
    function1(&testData[99]);
}

int main(void){

    function1((void*)20); /* converted in implementation-defined manner */
    test();

    return 0;
}

输出:

para add: 0xbfcce408 local add: 0xbfcce40c
para add: 0xbfcce248 local add: 0xbfcce24c

答案 1 :(得分:0)

参数和局部变量在堆栈上的确切位置是实现定义

也就是说,一般来说,你会发现局部变量更接近堆栈顶部而不是参数,并且在大多数实现中,堆栈向下增长。