C语言内存管理
作用域:
1、代码块儿作用域:
注意的是:这里面{}就代表一个代码块儿,里面的东西是独立的,不可被其他地方访问的。
2、函数作用域
3、文件作用域
先提一下
在当前有一个文件,main.c
还有一个文件比如叫做a.c
这个东西就属于文件作用域了,左边有一个变量叫做mainiii=0 在a.c里面有一个变量叫做aiii = 3.两个变量分属不同的文件,他们拥有各自的文件作用域,不能混用。
4、Auto:自动变量
一般不写就认为是auto类型的。我们通常定义的变量都属于 auto,他们都存放在 内存中,主要与register相区别。
5、Register 类型变量
使用方式: register int i=3;
是C语言建议把这个变量 i放到寄存器中,(通常情况下会放到寄存器中。但有时也不一定)用来提高当前变量的执行效率。因为是放入了寄存器,所以不提供取地址的服务。也就是说:
Register int i =3;
Int *p = &i;//这样做是不合法的,因为 已经把当前变量放入了寄存器中,在寄存器里面是没有地址的,也就没有办法取出。即使 这个变量没有真正被放到寄存器里面,也不能够去它的地址。
6、静态变量
只能在当前块儿内使用。但是在代码运行之初就完成初始化。并且一直保留直到程序结束。而非代码块执行结束。
静态变量还有一种用法,用来标识文件。
在当前目录下,main.c里面有aiii,在 a.c里面定义了 aiii=3;这样aiii拥有了全工程的范围,所以如果不希望别的地方也使用这个aiii,或者希望只在a.c里面使用aiii的话。就可以加static这个关键字。
现在有一个结果就是 aiii的值 不再是3了。
说明没有访问到a.c里面的内容。
那么0是什么情况呢?
0是由于 我们在main.c里面声明了一个 变量,这个 变量就是 全局的,全局变量默认初始化成0.所以我们得到了0的结果。
如果去掉 int aiii;的声明那么我们的访问就是 非法的了,因为 并不存在 这样一个aiii变量。
为了让我们的程序运行的更加合理,标明这个 变量到底是自己定义的,还是 外部引用的,就需要另外一个关键字extern。这个关键字在前面说,利用C++语言写一个DLL然后按照C语言编译也需要这样一个关键字。
但是这种写法是不可以的:
main.c里面说 外面有一个 aiii。在a.c里面说aiii仅当前文件可用。->其实没有aiii可用,这样编译器还在找这个 aiii,那么解析的结果就是 没有一个 靠谱的外部符号。
这个 时候 如果 去掉 static 那么运行就正常了。
并且也有合理的标识,告诉main.c 说 我这个 里面的 aiii就是 外面的,要么有,使用外面的,要么没有,报错。这样比起一个不确定的结果可0 可3的数字,要靠谱的多。
在C语言里面,写在函数外面的声明定义 就是 全局的,会默认赋初值0,如果我们没有自己定义初值的话。如果要共享这个 变量那就写 成 int i=[某个数]并且在其他的文件中写上extern表示 当前这个i是从别的文件中引入的变量;如果当前变量仅当前文件可用,那就加上static。表示 文件域。
C语言内存管理的更多相关文章
- Go语言内存管理(一)内存分配
Go语言内存管理(一)内存分配 golang作为一种"高级语言",也提供了自己的内存管理机制.这样一方面可以简化编码的流程,降低因内存使用导致出现问题的频率(C语言使用者尤其是初学 ...
- C语言 内存管理(转)
转自 https://blog.csdn.net/u011616739/article/details/61621815 C语言 内存管理 1.内存分区 C源代码进过预处理.编译.汇编和链接4步生成 ...
- 深入理解Linux C语言内存管理
问题不能拖,我这就来学习一下吧,争取一次搞定. 在任何程序设计环境及语言中,内存管理都十分重要. 内存管理的基本概念 分析C语言内存的分布先从Linux下可执行的C程序入手.现在有一个简单的C源程序h ...
- C语言内存管理(转)
伟大的Bill Gates 曾经失言: 640K ought to be enough for everybody — Bill Gates 1981 程序员们经常编写内存管理程序,往往提心吊胆.如果 ...
- iOS学习08之C语言内存管理
本次主要学习和理解C语言中的内存管理 1.存储区划分 按照地址从高到低的顺序:栈区,堆区,静态区,常量区,代码区 1> 栈区:局部变量的存储区域 局部变量基本都在函数.循环.分支中定义 栈区的内 ...
- 深入理解C语言内存管理
之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少. 问题不能拖,我这就来学习一下吧,争取一次搞定. 在任何程序设计环境及 ...
- 一个C语言内存管理模块的实现
C 内存管理模块的编写 C语言手动管理内存很困难,有时候很难发现内存泄漏,这两天看了一下里面有写了一个简单的内存管理模块,发现挺精巧,可以有效检测内存泄漏 原理很简单,就是把C的malloc函数分配的 ...
- Objective-C语言内存管理
• Objective-C为每个对象提供一个内部计数器,这个计数器跟踪对象的引用次数.所有类都继承自 NSObject 的对象retain和release方法. 如果使用了new.alloc或copy ...
- 黑马程序员——OC语言 内存管理
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)计数器 每个对象内部都保存了一个与之相关联的整数,称为引用计数器,当 ...
- OC语言-05-OC语言-内存管理
一.引用计数器 1> 栈和堆 栈 ① 主要存储局部变量 ② 内存自动回收 堆 ① 主要存储需要动态分配内存的变量 ② 需要手动回收内存,是OC内存管理的对象 2> 简介 作用 ① 表示对象 ...
随机推荐
- delphi获得当前鼠标坐标
简单的说就是取鼠标所在位置对应的窗口句柄? procedure TForm1.Timer1Timer(Sender: TObject);vara:TPoint; //用来存放坐标hw:HWND; // ...
- FFmpeg 2.0编译配置
./configure --enable-shared --enable-doc --enable-ffmpeg --enable-ffplay --enable-ffprobe --enable- ...
- MSP430F149流水灯闪烁以及数码管的显示
今天下午写了一个流水灯闪烁的实验,总的来说,不难,因为这块板子集合的电路图没有上一块那么复杂,所以总的来说,还是比较顺手,开始的时候,出现流水灯没有流转的现象,原来是没有加入延时函数,后来经过调整,结 ...
- MFC消息映射机制
1.MFC应用框架主要类之间的关系 MFC自动生成的框架中重要的类有:C-App.CMainFrame.C-Doc和C-View. 其他的类如CClassView.CFileView等都是在框架窗口( ...
- USB HID报告及报告描述符简介
在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等.USB报告描述符(Report Descriptor)是HID ...
- 用Python写的批量文件重命名
有些时候下载图片或其他文件,文件名都怪怪的,可选的办法是下载一个文件批量重命名的软件.当然,如果想自己'DIY'一把的话编个Python脚本最好不过了. 下面的代码实现的对指定类型的文件进行批量重 ...
- Codeforces Round #355 (Div. 2)
A 弯腰 #include<cstdio> #include<cstring> #include<iostream> #include<queue> # ...
- javscript面试题(一)
你如何理解HTML结构的语意化? 1.去掉或样式丢失的时候能让页面呈现清晰的结构:2.屏幕阅读器(如果访客有视障)会完全根据你的标记来“读”你的网页:3.PDA.手机等设备可能无法像普通电脑的浏览器一 ...
- leetcode–Binary Tree Maximum Path Sum
1.题目说明 Given a binary tree, find the maximum path sum. The path may start and end at any node in t ...
- 企业DC Windows运维监控规范及C辅助监控开发实战前奏;
春天来了,小草发芽了,花儿开了,你还在等什么? 人家都自驾游了,ruiy可还是徒步游的,并且还留着汗+油; 什么是生活,我的理解就是跟着gd生,跟着gd活,可是讲到这我又自恋了,人家开二会也没想起我来 ...