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。表示 文件域。

时间: 2024-08-07 08:23:08

C语言内存管理的相关文章

iOSDay08之C语言内存管理

本次主要学习和理解C语言中的内存管理 1.存储区划分 按照地址从高到低的顺序:栈区,堆区,静态区,常量区,代码区 1> 栈区:局部变量的存储区域 局部变量基本都在函数.循环.分支中定义 栈区的内存空间由系统自动分配和回收 栈顶,栈底:先定义的局部变量存储区域从栈底开始分配,后定义的局部变量向栈顶分配 特点:先进后出,后进先出 当函数.循环.分支结束后,局部变量的生命周期结束,不能被使用,由系统自动回收内存空间 1 void test1() { 2 int a = 100; 3 } 4 5 voi

iOS核心语言Objective C语言 —— 内存管理

本分享是面向有意向从事iOS开发的伙伴以及苹果产品的发烧友们,或者已经从事了iOS的开发者,想进一步提升者.如果您对iOS开发有极高的兴趣,可以与我一起探讨iOS开发,一起学习,共同进步.如果您是零基础,建议您先翻阅我之前分享的iOS开发分分钟搞定C语言系列,然后在开始Objective C语言的学习,如果您遇到问题也可以与我探讨,另外将无偿分享自己整理出来的大概400G iOS学习视频及学习资料,都是干货哦!可以新浪微博私信?关注极客James,期待与您的共同学习和探讨!!由于时间有限,每天在

Objective-C语言-内存管理

OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效. 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也

OC语言--内存管理

1.内存管理原理的介绍 1.1C的内存管理 char *p = (char *)malloc(100*sizeof (char)); 这是C的动态内存分配,我们手动跟系统申请了100个字节的内存:或者说系统在堆里开辟了100个字节的空间,并将这个空间的首地址返回给指针变量p. strcpy(p,"Hello World!"); 将字符串拷贝给指针变量p指向的内存空间. puts(p); 将p指针指向的内存空间里的字符串打印出来. free(p); 使用完成后,手动跟系统释放内存空间:或

C 语言内存管理

// // main.m #import <Foundation/Foundation.h> int a =100; //void test(){ // int a =8; // //} //当函数调用的时候test2当中的变量c d会打印test1中a,b的值,是因为当我们函数test1运行结束之后会释放a,b的标记(地址),但是a b的值依然存在,所以当我们类型相同的函数和其内部变量定义出来之后(没有初值),我们还会使用的是相同的内存里边的相同的值所以切记要去"赋初值"

浅谈C语言内存管理、内存泄露、堆栈

1.内存分配区间: 对于一个C语言程序而言,内存空间主要由五个部分组成:代码段(.text).数据段(.data).静态区(.BSS).堆和栈组成. BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量和静态变量 (这里注意一个问题:一般的书上都会说全局变量和静态变量是会自动初始化的,那么哪来的未初始化的变量呢?变量的初始化可以分为显示初始化和隐式初始化,全局变量和静态变量如果程序员自己不初始化的话的确也会被初始化,那就是不管什么类型都初始化为0,这种没有显示初始

【转】C语言知识整理(3):内存管理(详细版)

原文链接:http://www.cnblogs.com/yif1991/p/5049638.html 在计算机系统,特别是嵌入式系统中,内存资源是非常有限的.尤其对于移动端开发者来说,硬件资源的限制使得其在程序设计中首要考虑的问题就是如何有效地管理内存资源.本文是作者在学习C语言内存管理的过程中做的一个总结,如有不妥之处,望读者不吝指正. 一.几个基本概念 在C语言中,关于内存管理的知识点比较多,如函数.变量.作用域.指针等,在探究C语言内存管理机制时,先简单复习下这几个基本概念: 1.变量:不

Objective-C内存管理

1.内存管理中的基本问题 1.1为什么要进行内存管理    分配在堆空间中的对象 需要手动去释放 回顾堆栈的区别                                                                          生命周期 栈空间    函数 函数中局部变量             调用函数压栈    函数调用结束 释放 数据段    静态变量  全局变量                程序开始             程序结束 释放 堆:     

OC基础 内存管理

OC基础  内存管理 我们所了解的c语言内存管理,如下: (1)c语言的内存分配:char *p = (char*)malloc(100*sizeof(char)); (2)c语言的内存释放:free(p); c语言内存管理存在的缺陷: (1)不释放就会造成内存泄露. (2)多次释放就会造成崩溃. (3)大型项目中多人对一块内存进行操作时,不能释放内存,因为不知道别人是否还在使用. oc语言的内存管理 1.内存管理 (1)引用计数. (2)内存管理的黄金法则:谁创建谁释放. 让我们来看一下测试例