我正在学习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
我知道每个函数都有它的地址,但是每个局部变量的地址和函数中的每个参数总是一样吗?
答案 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)
参数和局部变量在堆栈上的确切位置是实现定义。
也就是说,一般来说,你会发现局部变量更接近堆栈顶部而不是参数,并且在大多数实现中,堆栈向下增长。