文档章节

C语言中变量存储的实质

一千零一夜个为什么
 一千零一夜个为什么
发布于 2016/11/24 21:29
字数 1264
阅读 43
收藏 0
点赞 0
评论 0

c中常会见到指针,但是指针的理解还需要要从变量中说起,先看内存空间:

如图:内存是一个存放数据的空间,就像电影院一样,都有自己的编号,这种有序的编号成为内存编址。内存是按照字节一个一个的编址。每个字节都有编号,我们称之为内存地址。

如:

    int i;
    char b;
在使用变量的时候先申明两个变量,系统会自动的在内存中给你申明的两个变量分配空间:如下所示

以6开始,给i分配了2个字节,给a分配了一个字节。

i=30;
b= 'a';
存储完了之后如下所示:

这时候时候 &i, &b就可以看到当前的存储地址;

 

在计算机中,运算的部分主要是cpu, 但cpu不会直接和硬盘发生数据的交换,因为cup的处理速度远远的大于硬盘的速度。因此,他们两个之间出现了内存这个东西,内存起到一个缓冲的作用。当程序运行的时候,首先是把程序加载到内存,然后cup从内存中取出指令以及传输的数据。[但是内存是掉电之后里面的数据就会丢失,而磁盘里面的数据会一直存在的,因此,当你关机之后,内存就会被清空,下次开机的时候重将系统程序从磁盘加载到内存,然后再执行。这种每次断电之后开机都会重新从磁盘加载系统程序到内存的方法明显影响了开机的速度,因此现在人们想出了一种办法在断电之后仍能保证内存的数据不会丢失的办法,那就是断电之后仍然给内存供极少的电量来保证内存的数据不会丢失,着就是所谓的低功耗。当下次打开电脑的时候,系统加载会很快。]

所以说,内存是程序运行的过程中不可缺少的东西,现在看下编译器是怎么把整个内存进行分配的。我们写的C语言的源码必须的转化为机器能识别的二进制文件,计算机才能够运行。因此:

源码经过汇编-->编译成为二进制文件,然后编译器将所有的二进制文形成一个整体的二进制文件。

在上述的过程中编译器会在内存中分出以下的几个阶段:

代码段:代码段用来存储加载到内存的二进制代码。cpu从里面取指令。
数据段:数据段细分为三段:
            1、已初始化读写数据段:主要存放声明并有初值的全局变量和加了static关键字的局部变量,它们的值都是可以改变的。

            2、未初始化数据段BSS:主要存放的是未初始化的全局变量和加了static关键字的未初始化局部变量。

            3、只读数据段:该数据段主要是存储程序中的常量数据(内容是不能改变的),一般所称的常量区就是指该数据段


变量或者常量在上诉几个内存段中分配好之后,在整个程序运行过程中都有效,生命周期从建立到整个程序运行结束才释放,我们称之为静态存储区。


三、初始化完成之后程序应该要执行了,在执行的过程中会在分出两个段:

堆:主要是提供给程序猿用malloc()函数动态分配需要的内存大小的。
栈:主要是分配函数里面的未加static关键字的局部变量和函数的行参的

这两个段是在程序运行的过程中动态分配的,当调用函数的时候为其行参和未加static的局部变量分配内存,当函数调用结束内存释放,我们称为动态存储区。

注明:全局变量加关键字static只是影响该变量的作用域,加上了就只能在该文本文件里面用,而不能在其他文件里面使用该变量。不会影响其存储位置,有无关键字都是存储在静态存储区里面的。但是局部变量若加了static则会将该变量存储在静态存储区里面,不加应该是在动态存储区栈里面的,只是影响了存储位置,不会影响其作用域。

补充:全局变量是在编译的过程中就在静态存储区里面分配内存的,而局部变量则是在程序运行过程中动态分配内存的。
盗一张图看下:

            

 

可以对应当前的图进行对号查看。

© 著作权归作者所有

共有 人打赏支持
一千零一夜个为什么
粉丝 3
博文 41
码字总数 13031
作品 0
朝阳
程序员
(一)Block的实质初探

相关文章 (一)Block的实质初探 (二)Block之存储域 NSConcreteStackBlock,NSConcreteGlobalBlock,NSConcreteMallocBlock (三)Block之截获变量和对象 (四)Block之 _block修饰符及其存...

madaoCN ⋅ 2017/10/21 ⋅ 0

(三)Block之截获变量和对象

相关文章 (一)Block的实质初探 (二)Block之存储域 NSConcreteStackBlock,NSConcreteGlobalBlock,NSConcreteMallocBlock (三)Block之截获变量和对象 (四)Block之 _block修饰符及其存...

madaoCN ⋅ 2017/10/21 ⋅ 0

C语言指针的讲解(一)

谨记 人一定要经得起假话,受的起敷衍,忍得住欺骗,忘得了诺言,放得下一切,失去的东西,其实从来就不真正的属于你,你也不必惋惜,有得必有失,相信是你的那一定是你的,不是你的就不是你...

长风留言 ⋅ 2017/11/12 ⋅ 0

C语言的理解

一直想整理一套C语言的材料。因为,工作这么多年,回头看看一些传统C教程,参照工作和C的国际标准,发现错误不少。另外经常接触和有意识的培训些C的新学者,发现很多思维并不妥当(针对C)。...

中山野鬼 ⋅ 2012/03/09 ⋅ 8

iOS中的(null) nil 问题

前段时间开发过程中,界面上莫名其妙的有些地方显示(null)有些地方显示 <null>,修改起来很蛋疼,经过查找资料来总结一下其中的微妙,免得以后再在这个东西上花无谓的时间去修改。 首先记录...

Marginx ⋅ 2015/10/06 ⋅ 0

foo是个什么东东

很多教程序的书里,都有采用foo命名的变量、函数,那么foo究竟是个什么东西呢? 从网络上可以查考到它的英文解释: * foo /foo/ 1. interj. Term of disgust. 2. [very common] Used very g...

五岳之巅 ⋅ 2010/03/17 ⋅ 0

runtime讲解

1.runtime是什么? runtime直译就是运行时间,run(跑,运行) time(时间),网上大家都叫它运行时,它是一套比较底层的纯C语言API,属于一个C语言库,包含了很多底层的C语言API,它是OC的幕后工作者,...

刀客445 ⋅ 2016/05/19 ⋅ 0

java中==和equals的区别

在Java日常编程中经常使用==或者equals来比较两个变量,那么这两种方式有什么区别呢。 堆栈:首先我们要明确堆和栈的概念,在系统内存中将局部变量存放在栈中,将new出来的对象以及一些方法(...

小和尚敲代码 ⋅ 2015/01/11 ⋅ 0

c语言的一些回顾------关键字之存储类别描述符

c语言的一些回顾------关键字之存储类别描述符 距离大一学C语言已经有三年的时间了,现在大部分内容都记得不是很清楚了,现在突然萌发了重温C语言的想法,古人说的好,温故而知新嘛,虽然这个...

ido_1992 ⋅ 2014/02/28 ⋅ 2

C语言中变量存储类别

C语言根据变量的生存周期来划分,可以分为静态存储方式和动态存储方式。 静态存储方式:是指在程序运行期间分配固定的存储空间的方式。静态存储区中存放了在整个程序执行过程中都存在的变量,...

余二五 ⋅ 2017/11/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java集合类总结笔记

一、集合类的层次关系 主要容器集合类的特点: ArrayList 一种可以动态增长和缩减的索引序列 LinkedList 一种可以在任何位置进行高效地插入和删除的有序序列 ArrayDeque 一种用循环数组实现的...

edwardGe ⋅ 6分钟前 ⋅ 0

spring RMI远程调用

RMI https://www.cnblogs.com/wdh1995/p/6792407.html

BobwithB ⋅ 11分钟前 ⋅ 0

Jenkins实践2 之基本配置

1 插件管理 系统管理->插件管理 在可选插件中可以自主安装插件 2 管理用户 系统管理->管理用户->新建用户 3 安全配置 系统管理->全局安全配置 授权策略 选择安全矩阵 然后添加现有的用户,赋...

晨猫 ⋅ 11分钟前 ⋅ 0

c++智能指针

1、是一种泛型类,针对指针类型的泛型类,会保存指针 2、重载了符号 *和-> 对智能指针使用这两个符号,相当于对保存的泛型使用这两个符号 3、当智能指针引用计数为0时,会去释放指针指向的资...

国仔饼 ⋅ 12分钟前 ⋅ 0

Spring Boot错误处理机制

1)、SpringBoot默认的错误处理机制 默认效果: 1)、浏览器,返回一个默认的错误页面 浏览器发送请求的请求头: 2)、如果是其他客户端,默认响应一个json数据 原理: 可以参照ErrorMvcAut...

小致dad ⋅ 13分钟前 ⋅ 0

ftp连接不上的终极办法 SFTP

假如FTP由于各种原因就是连不上,那么用SFTP协议吧,使用登录服务器的账号密码。

sskill ⋅ 18分钟前 ⋅ 0

Unity 围绕旋转角度限制(Transform.RotateAround)

在 Unity 中可以利用 Transform.RotateAround 围绕指定物体进行旋转,但某些情况下可能需要对旋转角度进行控制。我是先计算出预设角度大小,然后判断是否在限定角度范围内是则进行旋转。 相关...

大轩 ⋅ 19分钟前 ⋅ 0

阿里沙箱环境支付宝测试demo

阿里支付宝支付和微信支付,包括:阿里沙箱环境支付宝测试demo,支付宝支付整合到spring+springmvc+mybatis环境和微信整合到如上环境,功能非常齐全,只需要修改对应的配置文件即可,帮助文档...

码代码的小司机 ⋅ 22分钟前 ⋅ 0

JDK1.6和JDK1.7中,Collections.sort的区别,

背景 最近,项目正在集成测试阶段,项目在服务器上运行了一段时间,点击表格的列进行排序的时候,有的列排序正常,有的列在排序的时候,在后台会抛出如下异常,查询到不到数据,而且在另外一...

tsmyk0715 ⋅ 39分钟前 ⋅ 0

C++ 中命名空间的 5 个常见用法

相信小伙伴们对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述。 命名空间在1995年被引入到 c++ 标准中,通常是这样定义的: 命名...

柳猫 ⋅ 43分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部