zoukankan      html  css  js  c++  java
  • 全局变量,局部变量,静态变量,堆,栈之间的关系

      以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

      

      

  • 相关阅读:
    excel读取 工具类
    对电脑屏幕进行拍照(屏幕截图),保存为图片---工具类
    DateTimePicker:jQuery日期和时间插件
    集合工具类
    二维码工具类
    JavaScript 排序算法——快速排序
    IP工具类——IpAddress.java
    验证码图片生成工具类——Captcha.java
    文件相关操作工具类——FileUtils.java
    weblogic使用root用户启动后,不能再使用weblogic启动的修复办法
  • 原文地址:https://www.cnblogs.com/wdc123/p/3388227.html
Copyright © 2011-2022 走看看