动态内存分配(动态存储期)
在程序执行并使用该变量的时候分配内存空间,使用完毕立即释放.
动态内存分配就 是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据 程序的需要即时分配,且分配的大小就是程序要求的大小。
当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存贮空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存贮空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。
在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道我们要定义的这个数组到底有多大,那么你就要把数组定义得足够大。这样,你的程序在运行时就申请了固定大小的你认为足够大的内存空间。
即使你知道你想利用的空间大小,但是如果因为某种特殊原因空间利用的大小有增加或者减少,你又必须重新去修改程序,扩大数组的存储范围。这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷,特别是处理某些问题时:在大多数情况下会浪费大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。
我们用动态内存分配就可以解决上面的问题. 所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点:
1、不需要预先分配存储空间;
2、分配的空间可以根据程序的需要扩大或缩小。
常见的动态内存错误:
(1)对NULL指针进行解引用操作
(2)对分配的内存进行操作时越过边界
(3)释放并非动态分配的内存
(4)试图释放一块动态分配的内存的一部分以及一块内存被释放之后被继续使用。
说明:
1、动态分配最常见的错误就是忘记检查所请求的内存是否成功分配。
2、动态内存分配的第二大错误来源是操作内存时超出了分配内存的边界。
当你使用free时,可能出现各种不同的错误:
1、传递给free的指针必须是一个从malloc、calloc或realloc函数返回的指针。
2、传递给free函数一个指针,让它释放一块并非动态分配的内存可能导致程序立即终止或在晚些时候终止。
3、试图释放一块动态分配内存的一部分也有可能引起类似问题。
//实例:动态内存分配实现可变长一维数组
#define _GRT_SECURE_NO_WARNNGS
#include<stdio.h>
#include<stdlib.h>
#include"array.h"//这个头文件 里边包含一个结构表示数组和下列函数的声明原型
const Block_size = 20;///一次增容20个存储空间
/*
Array array_creat(int ints_size); //创建一个数组
void array_free(Array *a);//回收空间
int array_size(const Array *a);//查看当前数组大小
int *array_at(Array *a, int index);//访问数组
void array_inlate(Array *a, int more_size);//增容
*/
int main(void) {
Array a;//表示数组初始值的大小
int i, j,n,m=0;
while (1) {