【问题标题】:Address of parameters and local variables in function's stack frame函数栈帧中参数和局部变量的地址
【发布时间】:2016-02-26 00:55:05
【问题描述】:

我正在学习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

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

【问题讨论】:

  • %p in printf() 调用 void*,而不是另一个指针。将类型错误的数据传递给printf() 会调用未定义的行为
  • C 标准不强制要求使用堆栈或任何其他内存管理技术。有一些很好的实现根本不使用堆栈。

标签: c stack


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 2012-09-05
      • 1970-01-01
      • 2014-04-12
      相关资源
      最近更新 更多