动态内存分配

====================
====================
动态内存分配
====================
====================
数组元素存储在内存中连续的位置上。当一个数组被声明时,它所需要的内存在编译时就被分配。但是也可以使用动态分配内存在运行时为它分配内存
1.为什么使用动态分配内存?
  当我们声明数组时,必须用一个编译时常量来指定数组的长度。但是数组的长度往往在运行时在会知道,这是由于他所需要的内存空间取决于输入数据
例如,一个用于计算学生等级和平均分的程序可能存储一个班所有学生的数据,但不同班级的学生数量是不同的,在这种情况下我们通常采用的办法是声明
一个较大的数组,它可以容纳可能出现的最大值。
  提示:这种方法的优点是简单,但它有好几个缺点。首先,这种声明引入了人为的限制,如果程序需要使用的数据元素超过了声明的长度,它就无法处理
  要避免这种情况,显而易见的做法是声明一个更大的数组,但这种做法使它的第二个缺点进一步恶化。如果程序实际需要的元素数量比较少巨大的数组
  就会造成很大的浪费。第三个缺点如果输入的数据超过了数组的容纳范围,程序必须以一种合理的方式作出响应。
2.malloc和free
动态内存分配允许程序为一个长度在运行时才知道的数组分配内存空间。
malloc和calloc函数都用于动态分配一块内存,并返回一个指向该内存块得指针。malloc的参数就是需要分配的内存的字节数。
和它不同的是calloc的参数是你需要分配的元素个数和每个元素的长度。calloc函数在返回前把内存初始化为零,而malloc函数返回
时内存并未以任何方式进行初始化。调用realloc函数可以改变一块应经动态分配的内存的大小。增加内存块大小时有可能采取的
方法是把原来内存块上的所有数据复制到一个新的、更大的内存块上。当一个动态分配的内存块不再使用时,应该调用free把它
归还给可用内存池。内存被释放之后便不能再被访问。
    如果请求的内存分配失败,malloc、calloc和realloc函数返回的将是一个NULL指针。错误地访问分配内存之外的区域所引起的
后果类似越界访问一个数组,但这个错误还可能破坏可用内存池,导致程序失败。如果一个指针不是从早先的malloc、calloc或realloc
函数返回的,他是不能作为参数传递给。你也不能只释放一块内存的一部分。
    内存泄露是指内存被动态分配以后,当它不再使用时未被释放
posted @ 2011-04-01 16:25  jerryking  阅读(658)  评论(0编辑  收藏  举报