马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
内存的使用是程序设计中需要考虑的重要因素之一,这不仅由于系统内存是有限的,而且内存分配也会直接影响到程序的效率。因此,我们要对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() { intb; /星号b在栈星号/ chars[]="abc"; /星号s在栈,"abc在常量区"星号/ char星号p2; /星号p2在栈星号/ char星号p3="123456"; /星号"123456"在常量区,p3在栈星号/ staticint c=0; /星号可读可写数据段星号/
p1=(char星号)malloc(10); /星号分配得来的10个字节的区域在堆区星号/ p2=(char星号)malloc(20); /星号分配得来的20个字节的区域在堆区星号/ /星号从常量区的“Hello World”字符串复制分配到的堆区星号/ strcpy(p1,"HelloWorld");
return0; }
凌阳教育,全国唯一一家原厂式嵌入式培训机构,专业从事嵌入式人才培训13年,最近新开课程信息安全工程师培训,想了解更多嵌入式资料下载或者是凌阳教育的动态,请访问凌阳教育官网www.sunplusedu.com。 |