以c语言为例。
首先,要搞清楚程序在内存中是怎么存储的。一个c程序在内存中的存储映像可分为:动态存储区(堆栈),静态存储区,以及程序代码区。
其次,搞清楚全局变量,局部变量的概念,作用域,以及它们所在的存储位置。
全局变量:在函数外部定义的变量,也称为外部变量。全局变量都是静态的,但是静态全局变量和全局变量有一点差别(静态全局变量只初始化一次,防止在其他源文件调用!而全局变量可以再其他源文件初始化)。它的作用域是从变量定义的位置开始,到整个源文件结束。
例如:
#include<stdio.h>
void fun();
int sum;//这里的sum,就是全局变量。
int main()
{.....sum++;....}
fun()
{.....sum++;....}//两个sum自加的语句都是有效的。
注意:当全局变量和某个函数中的局部变量重名时,则在该函数内部,全局变量是被屏蔽的。全局变量的默认值是0。一般不提倡使用局部变量。
局部变量:在函数内部或复合语句中定义的变量,称为局部变量。函数的形参也是局部变量。作用域只是局限于函数内部,或者复合语句中。局部变量在没有赋值时,没有默认值。
void fun2(int i)
{for(int j; j<5;j++)...}//这里的i,和j都是局部变量。
注意:局部变量的定义必须放在所在函数体的所有可执行语句之前。使用局部变量的优点是:可在各个函数之间造成信息隔离,不同函数中使用的同名变量也不会相互影响。
静态变量:在变量前面加上static,就可以构成静态变量。其中有静态局部变量,和静态全局变量。
静态局部变量:存储在静态存储区,占据着永久性的存储单元。知道程序运行结束才会释放存储单元。由于并不释放存储单元,所以下次再进入该函数时,可以继续使用该存储单元的值。
然后,是各种变量在内存中所占用位置。
全局变量,静态变量存储在静态存储区。
局部变量存储在动态存储区中的栈中。
字符串常量也是存储在静态存储区。
关于字符串存储的位置,可以参考:http://www.2cto.com/kf/201304/205083.html
最后写一下,与动态存储区相关的堆栈。
堆栈,有人也把它称之为栈。我认为只要搞清楚栈,和堆的区别就行啦。
栈是由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆是一般由程序员分配释放, 若程序员不释放,没有被操作系统回收的话,可能会造成内存泄漏 。注意它与数据结构中的堆是两回事。例如c语言中通过malloc函数开辟的存储空间。
对于堆和栈,这篇文章给了我很多帮助,很好的一篇文章。http://www.cppblog.com/oosky/archive/2006/01/21/2958.html
。。