内存管理、内存分配malloc、free、realloc,printf小结

来源:互联网 发布:陌陌八格切图软件 编辑:程序博客网 时间:2024/06/05 10:45

      现在将一些内存管理相关的知识总结一下,以便对之前的知识进行归纳,也让自己清楚薄弱环节,以及提醒自己许多东西还是要做好准备!

    内存管理,片内碎片,片外碎片


内存分配机制malloc,realloc


内存释放机制free


指针的存放,堆区、栈区、数据区、代码区


变量的定义与初值

首先要了解内存中的存储空间,内存中用户区的存储空间主要分为程序区、静态存储区、动态存储区。

数据分别存放在静态存储区和动态存储区。静态存储区,主要存放全局变量和静态的局部变量。

动态存储区存放的数据为:

1 函数形式参数,在调用函数时给形参分配存储空间。

2自动变量(未加static声明的局部变量)

3函数调用时的现场保护和返回地址等。

对以上描述的动态存储区的数据,在函数调用开始时分配动态存储空间,函数结束时释放这些空间。在程序的执行过程中,这种分配和释放是动态的,如果在一个程序中两次调用同一函数,分配给此函数中的局部变量的存储空间地址可能是不相同的。

在C语言中,每个变量和函数有两个属性:数据类型和数据的存储类别。数据的类型这里不重点关注,重点关注数据的存储类别。数据的存储类别指的是数据在内存中存储的形式。存储类型具体包含四种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。根据变量的存储类别可以知道变量的存储域和生存期。

1 auto变量

函数中的局部变量,如果不专门声明为static存储类别,都是动态的分配存储空间的,数据存储在动态存储区中。auto可以省略。

2 static变量

用static声明的静态局部变量,在函数调用结束后不消失而是保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数结束时的值。编译时自动赋初值0。

虽然静态局部变量在函数调用结束后仍然存在,但是其他函数不能引用它。

3 register变量

一般情况下,变量的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到运算器中。

如果有一些变量使用频繁,则为存取变量的值要花费不少时间。为了提高效率,c语言允许将局部变量的值存放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。

4 extern变量

外部变量是函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中的各个函数所引用。编译时将外部变量存放在静态存储区,有时候需要将函数声明为外部变量来扩展外部变量的作用域。

比如在程序文件的中间定义的函数只能让其后定义的函数使用,而如果上面的函数调用则需要使用extern关键字声明,以扩展作用域到整个文件。

另外如果在一个程序文件中定义的变量如果想在另外的文件中使用,在需要在定义文件中定义,在引用文件中使用extern关键字声明。


从以上分析可以看出————
把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

因此static这个说明符在不同的地方所起的作用是不同的。应予以注意。



原创粉丝点击