C 语言入门/C 动态内存分配与释放
外观
< C 语言入门
对于简单的程序,只需声明一个给定大小的数组即可
char buffer[1024]
在更复杂的程序中,这会导致麻烦。可能无法知道程序执行的特定任务需要多大的数组,因此分配一个固定大小的数组要么会导致内存浪费,要么会导致内存不足以完成工作。
解决这个问题的办法是在运行时让程序分配内存,这就是“malloc()”库函数的作用。例如,让我们使用“malloc()”来分配一个“char”类型的数组
/*malloc.c */ #include <stdio.h> #include <stdlib.h> /*For "malloc", "exit" functions. */ int main() { char *p; /*Pointer to array. */ unsigned count; /*Size of array. */ puts( "Size of array?" ); scanf( "%d", &count ); /*Get size in bytes. */ p = malloc( (size_t)count ); /*Allocate array. */ if( p == NULL ) /*Check for failure. */ { puts( "Can't allocate memory!" ); exit( 0 ); } puts( "Allocated array!" ); free( p ); /*Release memory. */ return 0; }
必须包含头文件“stdlib.h”,并且必须声明指向要分配的内存块的指针。 “malloc()”函数将指针设置为已分配的内存块,使用
p = malloc( (size_t)count );
计数以字节为单位,并被“强制转换”为“size_t”类型,该类型在“stdio.h”中定义。 “malloc()”返回的指针被分配给变量“p”,该变量的类型为“char *”。在 ANSI C 中,"malloc()" 返回一个类型为 "void *" 的指针,该指针可以在没有强制转换的情况下分配给任何其他指针类型。
如果“malloc()”由于无法分配内存而失败,它将返回 NULL 值(如“stdio.h”中定义)。
分配其他数据类型很简单
int *buf; ... buf = malloc( (size_t)sizeof( int ) );
“sizeof()”函数用于确定“int”数据类型的字节数。
当程序完成使用内存块时,它使用“free”函数将其释放
free( p );
C 还包含另外两个与“malloc()”密切相关的内存分配函数:“calloc()”函数,它执行与“malloc()”相同的函数,但允许根据元素数量指定分配的块
void *calloc( size_t <number_elements>, size_t <sizeof_element_type> );
——以及“realloc()”函数,它重新分配数组的大小
已经分配了
void *realloc( void *<block_pointer>, size_t <size_in_bytes> );