记录值得记录下的事情

内存管理与动态分配

动态分配(dynamic allocation)是程序在运行期间根据实际需要动态的申请或释放内存的方式。动态内存分配不是像数组那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且所分配空间的大小也是根据程序的需要。

C语言的指针为动态分配系统提供了必要的支持,其内存管理过程通过函数来实现。函数的原型定义包含在头文件stdlib.h中,使用时程序中需包含#include <stdlib.h>宏命令。

(1)动态内存分配函数malloc( )

malloc()函数用于向内存申请分配一个的连续存储空间。若申请成功,则返回一个指向该存储空间起始地址的指针;若内存空间不足,申请失败,则返回空指针NULL。

函数原型:void*malloc(unsigned size);

size为申请的存储空间的字节数,在具体应用中,可将malloc()函数的返回值转换为指定的指针类型。

例如:利用malloc()函数分配1个连续的存储空间,将其起始地址赋给字符指针pc。

 char *pc;
 int *pi;
 pc = malloc (100); /*分配100个字节,使用字符指针pc指向该空间*/

调用malloc()函数时,一般使用sizeof计算存储单元的大小,因为不同平台中数据类型所占用的空间大小可能不同,例如,一个int型变量在TC环境下占用2个字节,而VC环境下需要占用4个字节。

由于存储空间分配失败将返回空指针。一般在调用内存分配函数后,都要对其返回值检查,确保指针是否有效。例如:

if((pi=malloc(50*sizeof(int)))==NULL) /* 检查返回指针*
{
    printf ("内存分配失败!");
}

(2)计数动态内存分配函数calloc( )

calloc()函数用于申请分配n个连续的存储区域,每个存储区域的长度为size个字节,并且将所分配的空间初始化为零。若申请成功,则返回一个指向该空间起始地址的指针;若申请失败,则返回空指针NULL。

函数原型:void *calloc(unsigned n, unsigned size);

(3)内存分配调整函数realloc( )

realloc()用于变更已分配内存空间的大小。realloc 可以将指针ptr所指向的空间扩展或者缩小为size大小的空间。如果变更成功,则返回一片大小为size的空间。

函数原型:void *realloc(void *ptr, unsigned size);

无论是扩展或是缩小,原有内存的中内容将保持不变。对于缩小空间,则被缩小的那一部分空间的内容会丢失。例如:

int* p = (int*) malloc (sizeof(int) * 10); /*先用 malloc 分配一指针,可以存放10个整数*/
p = (int *) realloc (p, sizeof(int) *15); /*原有空间不足,扩展了5个整数的存储空间*/
……

(4)动态内存释放函数free( )

free()函数用来释放由动态分配函数所分配的空间。

函数原型:void free(void *ptr);

参数ptr为指向某空间的指针。如果ptr为空指针(NULL),free()函数什么都不作。例如:

int * p = (int *) malloc(4); 
*p = 100;
free(p); /*释放 p 所指的内存空间*/

为保证动态存储区的有效利用,在某个动态存储区域不再使用时,应及时将其释放。需要注意的是,在动态存储区域被释放后,不允许再通过该指针去访问已经释放的区域,否则有可能引起灾难性后果。

标签: C, Memory, 内存, 动态分配, 管理

添加新评论