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

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

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

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

默认值: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函数也是不能被外部引用的,也就是说以上的两种方法都会运行不了。如:

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

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

  1. 满堂花醉三千客,一剑霜寒十四州。—第十六天

  2. Linux内存page,【原创】(十四)Linux内存管理之page fault处理

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  3. Oracle学习(十四)分表分区

    本文借鉴:Oracle亿级数据查询处理.Oracle 分区表使用和查询.垂直分区+水平分区(特此感谢!) 一.前言 大数据量的查询,不仅查询速度非常慢,而且还会导致数据库经常宕机,在尝试添加索引及查询 ...

  4. 山海演武传·黄道·第一卷 雏龙惊蛰 第二十二 ~ 二十四章 真龙之剑·星墟列将...

    山海演武传·黄道·第一卷 雏龙惊蛰 第二十二 ~ 二十四章 真龙之剑·星墟列将 "我是第一次--请你,请你温柔一点--"少女一边娇喘着,一边将稚嫩的红唇紧贴在男子耳边,樱桃小嘴盈溢 ...

  5. [系统安全] 二十四.逆向分析之OllyDbg调试INT3断点、反调试、硬件断点与内存断点

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  6. JVM上篇:内存与垃圾回收篇十四--垃圾回收器

    JVM上篇:内存与垃圾回收篇十四–垃圾回收器 1. GC分类与新能指标 1.1 垃圾回收器概述 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商.不同版本的JVM来实现. 由于JDK的版本处于高 ...

  7. 聊聊高并发(三十六)Java内存模型那些事(四)理解Happens-before规则

    在前几篇将Java内存模型的那些事基本上把这个域底层的概念都解释清楚了,聊聊高并发(三十五)Java内存模型那些事(三)理解内存屏障 这篇分析了在X86平台下,volatile,synchronize ...

  8. [Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  9. “李妈妈—嘉利敦” 十四天成长计划挑战赛

    "李妈妈-嘉利敦" 十四天成长计划挑战赛 受新冠状肺炎影响,本人的假期可能要延长到三月份. 为了提高自己的学习效率,也为了更好的应对此次疫情之后可能出现的经济衰退,为祖国的建设增砖 ...

最新文章

  1. 兰大博士神论文: 我和同门亲师妹是如何走到一起的?
  2. 在JavaScript中生成随机字符串/字符
  3. mysql 安装 安全错误_MySQL的安全问题从安装开始说起
  4. es6笔记 day3---对象简介语法以及对象新增
  5. python不同曲线设置标签_【图像分类】基于Pascal VOC2012增强数据的多标签图像分类实战...
  6. Throwable 结构图
  7. 2021中国音乐市场年度综合分析
  8. 二级c语言需要知道的知识点,2020年全国计算机二级C语言复习知识点:C语言基本知识(...
  9. NLP学习—14.Pointer Generator Network(指针)及代码实现
  10. ELK详解(四)——Head插件安装
  11. python 使用异常代替返回状态码
  12. 查看tomcat目前用的jdk版本
  13. 我是个骄傲的intj
  14. 如何在word文档使其单页变为横向,教程来啦,怎样把word文档更改为横向
  15. 最新USDT支付系统+支持ERC20/OMNI/代理商/第三方API
  16. c语言for循环语句试讲,C语言For循环试讲教学教案(7页)-原创力文档
  17. 分析mrp主要应用范围_MRP适用于相关需求的计划与控制
  18. 【python--爬虫】千图网高清背景图片
  19. Centos7开小鸡(centos7安装KVM+kimchi+wok开小鸡)第一篇安装kimchi wok
  20. Ubuntu16 wine安装迅雷

热门文章

  1. 今天下雪续写WIN10一键恢复免装机系统
  2. linux 文件描述符的一些底层实现
  3. 使用kazoo连接zookeeper并监听节点数量以及值变化
  4. 【整合】FPGA调用RAM资源
  5. 写一篇给自己1024的文章
  6. 浅谈网站关键词选取的规则和注意事项
  7. 艾永亮:企业未来的创新方向,跳出思维惯性是打造超级产品的基础
  8. 电路分析:一个简单的光控灯电路
  9. 【C++基础】C++入门篇之一篇博客带你看懂为什么学习C++,C语言和C++的主要区别
  10. 《数字孪生应用与虚拟现实技术发展综述》蒲雨彤 张岭江 范凌杰 杨秋琪 (重庆邮电大学 重庆 400065)