首页 理论教育C语言程序设计基础:动态数据概念和存储分配函数

C语言程序设计基础:动态数据概念和存储分配函数

【摘要】:malloc函数和free函数使用示例。在例8.17的程序中,通过存储分配标准库函数malloc分别按照所要求的长度分配存储空间,并将它们的起始地址转换为相应数据类型的指针赋值给对应的指针变量。在运行时间周期长或者动态存储分配操作频繁的程序设计中,特别要注意free函数的使用。对于动态分配的存储块使用完成后应尽快释放,否则有可能造成“内存泄漏”。

在C程序设计时,如果要使用变量数组必须先进行定义,然后才可以使用。当程序中定义变量或数组以后,系统就会给变量或数组按照其数据类型及大小来分配相应的内存单元,这种内存分配方式称为静态内存分配。也就是说,这些内存在程序运行前就分配好了,不可改变。例如:

int k;//系统将给变量k分配4个字节的内存单元

char ch[10];//系统为数组ch分配10个字节的内存块,首地址就是ch的值

C程序设计中,所谓“动态数据”指的是不需要事先定义使用的数据对象,而是在程序运行过程中按照实际需要向系统提出存储分配要求,然后通过指针运算方式使用从系统中分配到的存储空间。

为了能够在C程序中使用动态数据,就必须解决动态分配内存的问题。C标准库中提供了一系列用于存储分配的函数,存储分配函数的原型在头文件stdlib.h和alloc.h中均有声明,使用动态存储分配的应用程序中需要包含两个头文件之一。在与存储分配相关的函数族中,malloc和free是最常用的两个函数。

1.存储分配函数malloc

原型:void*malloc(size_t size);

功能:在主存储器中的动态存储区分配由size所指定大小的存储块,返回所分配存储块在存储器中起始位置(指针)。返回指针类型为void(空类型),在应用程序中应根据需要进行相应的类型转换。如果存储器中没有足够的空间分配,即存储分配失败时返回NULL。(www.chuimin.cn)

2.存储释放函数free

原型:void free(void*memblock);

功能:释放由指针变量memblock指明首地址的、通过malloc类库函数分配获取的存储块,即将该块归还操作系统。

需要注意的是,使用free函数只能释放由malloc类函数动态分配的存储块,不能用free函数试图去释放显式定义的存储块(如数组等)。

【例8.17】 malloc函数和free函数使用示例。

在例8.17的程序中,通过存储分配标准库函数malloc分别按照所要求的长度分配存储空间,并将它们的起始地址转换为相应数据类型的指针赋值给对应的指针变量。然后将指针变量和对它们的指针运算分别作为数据的地址和数据本身进行操作。

在使用动态存储分配的程序设计中,特别要注意释放的问题。例8.17程序中去掉后面3行free函数的调用似乎也不会出现问题,这是由于程序运行完成后其占用的所有存储区域都会归还系统。在运行时间周期长或者动态存储分配操作频繁的程序设计中,特别要注意free函数的使用。对于动态分配的存储块使用完成后应尽快释放,否则有可能造成“内存泄漏”。