C语言的内存分配区域可分为以下几种类型:
下面介绍几个内存分配函数:malloc,calloc,realloc,free
该函数的作用是分配内存块,但不进行初始化操作,一般分配内存后需要调用memset进行初始化。原型:
void *malloc( size_t size );参数size表示要分配的内存大小;
返回值:返回一个指向所分配空间的void指针,如果没有足够的内存可用,则返回NULL;如果要返回一个指向特定类型的指针,则在返回值上用一个类型转换;每次都检查 malloc 的返回。例如:
const int size = 10; char *string; string = (char *)malloc( size ); if( string == NULL ) printf( "Insufficient memory available\n" ); else { printf( "Memory space allocated for path name\n" ); free( string ); printf( "Memory freed\n" ); }
该函数的作用是分配一个元数被初始化为0的数组。函数原型:
void *calloc( size_t num, size_t size );参数说明:num表示元数的个数;size表示每个元数字节长度。
返回值:返回一个指向所分配空间的void指针。如果要返回一个指向特定类型的指针,则在返回值上用一个类型转换。例如:
long *buffer; buffer = (long *)calloc( 40, sizeof( long ) ); if( buffer != NULL ) printf( "Allocated 40 long integers\n" ); else printf( "Can't allocate memory\n" ); free( buffer );
该函数的作用数重新分配内存块。函数原型:
void *realloc( void *memblock, size_t size );参数说明:memblock:以前分配的内存块的指针;size:新的大小 (以字节为单位)。
long *buffer, *oldbuffer; size_t size; if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL ) exit( 1 ); size = _msize( buffer ); printf_s( "Size of block after malloc of 1000 longs: %u\n", size ); // Reallocate and show new size: oldbuffer = buffer; // save pointer in case realloc fails if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) )) == NULL ) { free( oldbuffer ); // free original block exit( 1 ); }
realloc可以对给定的指针所指的空间进行扩大或者缩小,无论是扩张或是缩小,原有内存的中内容将保持不变。当然,对于缩小,则被缩小的那一部分的内容会丢失。realloc并不保证调整后的内存空间和原来的内存空间保持同一内存地址。相反,realloc返回的指针很可能指向一个新的地址。
原型:
void free(void *p);参数p为已经分配的内存块。