对于同一个函数调用,处于不同的栈帧,则其栈帧的起始地址不同,那么函数中的局部变量的存储地址也就不同。
如下代码所示,func函数在递归调用中,在不同的栈帧中变量a的地址不同。
#include <stdio.h>
void func() {
int a = 5;
int *const q = &a;
printf("%d\n", q);
func();
}
int main(int argc, char const *argv[])
{
func();
return 0;
}
而当func函数不存在递归调用时,每次调用func函数,其中变量a的地址都相同。因为 每次调用func函数时,func函数的栈帧都是在main函数的栈帧之上,所以每次调用func函数的栈帧都位于相同的栈空间。如下代码所示。
#include <stdio.h>
void func() {
int a = 5;
int *const q = &a;
printf("%d\n", q);
}
int main(int argc, char const *argv[])
{
func();
func();
func();
return 0;
}