检查自变量的生命周期和作用域
#include<stdio.h>
int total(int n);
int reverse(int n);
int main()
{
int x=123;
printf("main: &x=%x,x=%d\n",&x,x); //输出x的地址和值
total(x+1);
printf("main: &x=%x,x=%d\n",&x,x); //输出x的地址和值
reverse(x+2);
printf("main: &x=%x,x=%d\n",&x,x); //输出x的地址和值
return 0;
}
int total(int n)
{
int t=0;
printf("total: &n=%x,&t=%x,n=%d\n",&n,&t,n); //输出n和t的地址,及n的值
return t;
}
int reverse(int n)
{
int m=0;
printf("reverse: &n=%x,&m=%x,n=%d\n",&n,&m,n); //输出n和m的地址,及n的值
return m;
}
输出结果分析:主函数main在调用函数total之前,起自变量x在其生命周期和作用域内。在调用函数total时,主函数main的自变量x作为实参给total的形参n初始化之后,离开作用域,函数total的自变量n和t进入其生命周期和作用域。从函数total返回主函数时,函数total的自变量n和
t结束了生命周期也就离开了作用域。主函数的自变量x回到作用域,在调用函数reverse的,main的自变量x作为实参给reverse的形参n初始化之后,离开作用域,函数reverse的自变量n和m进入生命周期和作用域,而且他们的空间恰是函数total的自变量n和t的空间,这是因为后者的空间
被撤销后,分配给了前者。从函数total返回主函数时,主函数的自变量x回到作用域,因为它的生命周期还没结束,所以他的地址和调用total之前的地址一样。
t结束了生命周期也就离开了作用域。主函数的自变量x回到作用域,在调用函数reverse的,main的自变量x作为实参给reverse的形参n初始化之后,离开作用域,函数reverse的自变量n和m进入生命周期和作用域,而且他们的空间恰是函数total的自变量n和t的空间,这是因为后者的空间
被撤销后,分配给了前者。从函数total返回主函数时,主函数的自变量x回到作用域,因为它的生命周期还没结束,所以他的地址和调用total之前的地址一样。