2.3.3 局部变量
本文讲的是C语言程序设计进阶教程一2.3.3 局部变量,如果一个函数有局部变量,那么这些局部变量被存储在调用栈中。考虑下面的例子:
实参k、m和p存储在返回位置A上面。局部变量t和u存储在实参上面的栈中。
现在必须再加上一条调用栈的规则:
如果函数有局部变量,那么局部变量被存储在实参之上。
如果函数有实参,那么实参是存储在返回位置上的。
实参和返回位置共同构成了被调用函数的栈帧。
当一个函数被调用时,这条调用之后的行编号就被压入调用栈。这个行编号就是“返回位置”(RL)。这是在被调用函数结束(即返回)之后程序继续执行的地方。
如果相同的函数在不同行处被调用,那么每个调用都有一个相应的返回位置(每个函数调用之后的那行)。
当一个函数结束之后,程序将从存储在调用栈顶部的行编号处继续执行。调用栈顶部的内容就会被弹出。
局部变量总是存储在栈上,在函数调用期间它们一直存放在那里。与它们的存在形成对比的是,“全局变量”在函数调用之间存在。全局变量通常是在一个给出的源文件顶部进行指定,任何函数都可以对它们进行读和写。虽然有时方便,但全局变量也可能导致微小的软件bug。1973年,Wulf等人写了一篇文章“全局变量被认为是有害的”。它较为详细地解释了为什么程序员应该避免使用全局变量。软件社区普遍同意这一观点,全局变量的使用从那时起就开始被强烈地抵制。虽然C允许使用全局变量,编写优秀的软件几乎也总是避免使用它们。主要的问题在于全局变量可以在程序的任何位置发生改变。随着程序变得越来越大且复杂,要去追踪这些全局变量可能发生变化的位置就会变得越来越困难。失去了变化的踪迹经常会导致程序出现异常的行为。想要获得更多信息,请阅读Wulf的论文来理解全局变量存在问题的原因。虽然全局变量强烈不建议,全局常量却是可以接受且被经常使用的,因为它们不会变化。
原文标题:C语言程序设计进阶教程一2.3.3 局部变量