一剑霜寒十四州——浅析内存分区(浅显)

 

以上是我们对内存区域的一个简单的划分,其中包括:代码段、全局(静态)变量区、栈以及堆,接下来让我们看看一些常见的内容分别位于哪个区域内,并对其生命周期、作用域、默认值、链接属性进行总结。

 

一、全局变量:定义在函数外部的变量

生命周期:从程序运行开始创建,程序结束销毁(太占内存)

作用域:从定义该变量开始,一直到文件的结束

默认值:0

内存区域:全局(静态)变量区

链接属性:外部

 

全局变量可以在其他的源文件中使用,例如:

 

 

首先在test_01 中定义一个全局变量a,并将其赋值为50

 

然后在另一个源文件test_02中,我们可利用extern 来使用全局变量 a。

 

注:extern 是计算机语言中的一个关键字,可置于变量或者函数前,以表示变量或者函数的定义在别的文件中。提示编译器遇到此变量或函数时,在其它模块中寻找其定义,另外,extern也可用来进行链接指定。

 

可以顺利运行

 

二、静态全局变量:

生命周期:从程序运行开始创建,程序结束销毁

作用域:从定义该变量开始,一直到文件的结束

默认值:0,

内存区域:全局(静态)变量区

链接属性:内部

 

当我们在全局变量前加关键字 static 时,就变成了静态全局变量,静态全局变量具有以下特点:

(a)不必担心其它源文件使用相同变量名,彼此相互独立。

(b)在某源文件中定义的静态全局变量不能被其他源文件使用或修改。

   (c) 只能在本文件中使用!不允许在其他文件里调用;

 

 

例如:

 

 

还是继续运行 test_02 ,运行失败是可预见的

 

 

 

三、局部变量:定义在函数内部的变量,包括形参。

生命周期:进入函数时创建,函数退出时销毁

作用域:只在函数内部有效

默认值:随机值

内存区域:栈

 

 

链接属性:无

 

 

例:

 

此程序运行的结果如下:

 

这是因为,局部变量在它的生命周期结束时,它的内存也随之消失,再次使用时再次申请空间,并且每次重新定义和初始化。

 

 

 

四、静态局部变量:

生命周期:第一次进入函数时创建,程序结束时销毁

作用域:只在函数内部有效

默认值:0

内存区域:全局(静态)变量区

链接属性:——

 

 

 

例:

 

我们把 a 定义成一个静态局部变量,虽然只加了一个关键字 static ,但结果会有很大差异

 

 

 

 

产生这种结果的原因是:静态局部变量所在的函数在多调用多次时,只有第一次才经历变量定义和初始化,以后多次在调用时不再定义和初始化,而是维持之前上一次调用时执行后这个变量的值。本次接着来使用。静态局部变量的这种特性,和全局变量非常类似。它们的相同点是都创造和初始化一次,以后调用时值保持上次的不变。不同点在于作用域不同。

 

五、动态内存:(下篇博客会具体介绍)

生命周期:调用动态内存创建函数时创建,free时销毁

作用域:在未free该动态内存前,只要获得该动态内存的首地址就可以使用

默认值:——

内存区域:堆

链接属性:——

 

六、函数:

 

 

有时候我们需要从别的源文件中引用其中的函数,我们有以下两种做法。当然前提是该函数不是 static 函数

 

 

第一种方法,我们直接用extern关键字来引用这个函数,如:

 

test_01 中定义了一个 add 函数,接下来在test_02中引用它:

 

可以正常运行。其结果为:

 

 

 

 

 

另一种方法就是自己创建一个头文件(add .h),在其中对所需函数进行声明。如下:

 

 

 

然后我们就可以在需要使用这个函数的源文件中引用这个头文件:

 

 

这个也是可以顺利运行的,其结果和第一种方法的运行结果一样。

这里插个题外话,#include后面可以是 < > 或者 “ ”,这两个是有一点区别的。

< > 是只从系统的标准路径查找头文件

“ ”  是首先在自己的工程里查找文件,找不到后,再去系统里找

 

 

 

再说回函数,和静态全局变量一样,static函数也是不能被外部引用的,也就是说以上的两种方法都会运行不了。如:

 

最后对函数总结一下,如果我们将来会在不同的源文件中使用很多相同的函数,大可以创建一个头文件,然后在其中对所需函数进行声明,这样每个源文件只需要引用这个头文件就可以了,而不需要去重复定义一个函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值