凌阳教育专注嵌入式教育14年,良心教育,有担当,有诚信,值得信赖的教育品牌,欢迎访问官网http://www.sunplusedu.com

内存管理

上一篇 / 下一篇  2016-04-05 16:19:44

内存的使用是程序设计中需要考虑的重要因素之一,这不仅由于系统内存是有限的,而且内存分配也会直接影响到程序的效率。因此,我们要对C语言中的内存管理,有个系统的了解。

C语言中,定义了4个内存区间:代码区;全局变量与静态变量区;局部变量区即栈区;动态存储区,即堆区。下面对四个区进行介绍。

①代码区。代码区中主要存放程序中的代码,属性是只读的。

②全局变量与静态变量区。也称为静态存储区域。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如:全局变量、静态变量和字符串常量。分排在这个区域中的变量,当程序结束时,才释放内存。因此,经常利用这样的变量,在函数间传递信息。

③栈区。在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。在linux系统中,通过命令“ulimit-s”,可以看到,栈的容量为8192kbytes,即8M

这种内存方式,变量内存的分配和释放都自动进行,程序员不需要考虑内存管理的问题,很方便使用。但缺点是,栈的容量有限制,且当相应的范围结束时,局部变量就不能在使用。

④堆区。有些操作对象只有在程序运行时才能确定,这样编译器在编译时就无法为他们预见分配空间,只能在程序运行时分配,所以称为动态分配。比如:下面的结构体定义:

struct employee

{

char name[8];

int age;

char gender;

float salary;

};   

在该结构体定义中,员工的姓名是用字符数组来存储。员工的姓名由用户输入,则只有在用户输入结束后,才能精确的知道,需要多少内存,在这种情况下,使用动态内存分配更合乎逻辑,应该把结构体的定义改成下面的形式:   

struct employee

{

char 星号name;

int age;

char gender;

float salary;

}

动态分配内存就是堆区上分配。程序在运行的时候用molloc申请任意多少的内存,程序员自己负责在何时用free释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

下面的这段程序说明了不同类型的内存分配。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

/星号C语言中的数据的分配内存星号/

int a=0;

char 星号p1;

int main()

{

       int b;                                   /星号b在栈星号/

       char s[]="abc";                     /星号s在栈,"abc在常量区"星号/

       char 星号p2;                      /星号p2在栈星号/

       char 星号p3="123456";              /星号"123456"在常量区,p3在栈星号/

       static int c=0;                /星号可读可写数据段星号/

      

       p1=(char 星号)malloc(10);   /星号分配得来的10个字节的区域在堆区星号/

       p2=(char 星号)malloc(20);   /星号分配得来的20个字节的区域在堆区星号/

       /星号从常量区的“Hello World”字符串复制分配到的堆区星号/

       strcpy(p1,"Hello World");

      

       return 0;

}

凌阳教育,全国唯一一家原厂式嵌入式培训机构,专业从事嵌入式人才培训13年,最近新开课程信息安全工程师培训,想了解更多嵌入式资料下载或者是凌阳教育的动态,请访问凌阳教育官网www.sunplusedu.com


相关阅读:

TAG: C语言 c语言 程序设计 影响

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar
博评网