一剑霜寒十四州——浅析内存分区
一、全局变量:定义在函数外部的变量
生命周期:从程序运行开始创建,程序结束销毁(太占内存)
作用域:从定义该变量开始,一直到文件的结束
默认值:0
内存区域:全局(静态)变量区
链接属性:外部
全局变量可以在其他的源文件中使用,例如:
然后在另一个源文件test_02中,我们可利用extern 来使用全局变量 a。
二、静态全局变量:
生命周期:从程序运行开始创建,程序结束销毁
作用域:从定义该变量开始,一直到文件的结束
默认值:0,
内存区域:全局(静态)变量区
链接属性:内部
当我们在全局变量前加关键字 static 时,就变成了静态全局变量,静态全局变量具有以下特点:
(a)不必担心其它源文件使用相同变量名,彼此相互独立。
(b)在某源文件中定义的静态全局变量不能被其他源文件使用或修改。
(c) 只能在本文件中使用!不允许在其他文件里调用;
还是继续运行 test_02 ,运行失败是可预见的
三、局部变量:定义在函数内部的变量,包括形参。
生命周期:进入函数时创建,函数退出时销毁
作用域:只在函数内部有效
默认值:随机值
内存区域:栈
此程序运行的结果如下:
这是因为,局部变量在它的生命周期结束时,它的内存也随之消失,再次使用时再次申请空间,并且每次重新定义和初始化。
我们把 a 定义成一个静态局部变量,虽然只加了一个关键字 static ,但结果会有很大差异
产生这种结果的原因是:静态局部变量所在的函数在多调用多次时,只有第一次才经历变量定义和初始化,以后多次在调用时不再定义和初始化,而是维持之前上一次调用时执行后这个变量的值。本次接着来使用。静态局部变量的这种特性,和全局变量非常类似。它们的相同点是都创造和初始化一次,以后调用时值保持上次的不变。不同点在于作用域不同。
五、动态内存:(下篇博客会具体介绍)
生命周期:调用动态内存创建函数时创建,free时销毁
作用域:在未free该动态内存前,只要获得该动态内存的首地址就可以使用
默认值:——
内存区域:堆
链接属性:——
六、函数:
可以正常运行。其结果为:
另一种方法就是自己创建一个头文件(add .h),在其中对所需函数进行声明。如下:
然后我们就可以在需要使用这个函数的源文件中引用这个头文件:
这个也是可以顺利运行的,其结果和第一种方法的运行结果一样。
这里插个题外话,#include后面可以是 < > 或者 “ ”,这两个是有一点区别的。
< > 是只从系统的标准路径查找头文件
“ ” 是首先在自己的工程里查找文件,找不到后,再去系统里找
最后对函数总结一下,如果我们将来会在不同的源文件中使用很多相同的函数,大可以创建一个头文件,然后在其中对所需函数进行声明,这样每个源文件只需要引用这个头文件就可以了,而不需要去重复定义一个函数。