跳轉到內容

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> );
華夏公益教科書