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> );