跳转到内容

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> );
华夏公益教科书