内存分配:malloc,calloc,realloc,free

前言

   C语言的内存分配区域可分为以下几种类型:

  1. :根据编译器的需要来进行分配和释放,需要时分配,不需要时自动释放;一般是存储函数的参数形参、局部变量和临时变量。
  2. :称为动态内存分配;一般由内存分配函数进行分配,例如malloc,当不需要该内存时必须显示释放该内存,例如使用free进行释放。
  3. 静态存储区:内存在编译时已经分配好了,不需要我们进行分配,程序结束时系统会自行释放;一般存储全局变量和static修饰的静态变量。
  4. 常量存储区:一般存储程序的常量。
  5. 代码区:存储函数体的二进制代码区域。

   下面介绍几个内存分配函数:malloc,calloc,realloc,free

malloc

    该函数的作用是分配内存块,但不进行初始化操作,一般分配内存后需要调用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" );
   }

calloc

    该函数的作用是分配一个元数被初始化为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 );

realloc

    该函数的作用数重新分配内存块。函数原型:

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返回的指针很可能指向一个新的地址。

free

原型:

void free(void *p);
参数p为已经分配的内存块。


你可能感兴趣的:(malloc,free,realloc,calloc)