函数的形参变量要等到函数被调用时才分配内存,局部变量也是如此。
局部变量是定义在函数内部的变量,它的作用域只在函数内部,函数之外调用它会产生你不能控制的结果。我们先来看一个例子:
#include <stdio.h>
int *Test(int);
int *Test(int tmp){
int a = 9;
return &a; //这里返回 局部变量a 的地址
}
int main(void) {
int *p;
int num = 1;
p = Test(num);
printf("%d\n", *p); //输出函数返回的结果
return 0;
}
这段程序并不能正常运行,错误提示是:
警告:函数返回地址是局部变量地址
说明主函数并不能调用子函数中的变量,这是因为程序中的变量都在系统堆栈中,在程序执行过程中,系统堆栈的栈顶指针在不断变化,随着子函数调用结束,栈顶指针会回落到主函数执行的地方,这时的局部变量就不在系统堆栈中了,也就无法使用了。
通过调用函数交换两数的程序:
#include <stdio.h>
void realExchange(int *, int *);
void realExchange(int *one, int *another) {
int tmp;
tmp = *one;
*one = *another;
*another = tmp;
}
int main() {
int num1 = 2;
int num2 = 6;
realExchange(&num1, &num2);
printf("交换结果:%d %d\n", num1, num2);
return 0;
}
运行结果:
交换结果:6 2
这里通过交换指针所指向空间的值,实现主函数中2 和 6 的交换。