分享方式:


malloc

配置記憶體區塊。

語法

void *malloc(
   size_t size
);

參數

size
要配置的位元組。

傳回值

malloc 會傳回配置空間的 void 指標,如果 NULL 記憶體不足,則傳回 。 若要傳回 void 以外類型的指標,請對傳回值使用類型轉換。 傳回值所指向的儲存空間會適當地對齊任何類型對象的儲存空間,其對齊需求小於或等於基本對齊。 (在 Visual C++ 中,基本對齊是 、 或 8 個字節所需的double對齊方式。在以64位平臺為目標的程式代碼中,它是16個字節。使用 _aligned_malloc 來配置具有較大對齊需求之物件的記憶體,例如,使用 where n 大於 8 宣告__declspec(align( n ))的 SSE 類型和 __m128 __m256、 和類型。 如果 size 為 0,malloc 會在堆積中配置零長度項目,並傳回該項目的有效指標。 請一律檢查 malloc 的傳回值,即使要求的記憶體數量很小亦然。

備註

malloc 函式至少會配置 size 個位元組的記憶體區塊。 因為對齊和維護資訊需要空間,所以此區塊可能會大於 size 個位元組。

如果記憶體配置失敗,或所要求的記憶體數量超過 _HEAP_MAXREQmalloc 會將 errno 設為 ENOMEM。 如您需要此錯誤碼和其他錯誤碼的相關資訊,請參閱errno_doserrno_sys_errlist_sys_nerr

啟動程式碼使用 malloc 來為 _environenvpargv 變數配置儲存空間。 下列函式及其對應的寬字元版本也會呼叫 malloc

C++函式 _set_new_mode 會設定 的新處理程式模式 malloc。 新的處理常式模式表示失敗時,malloc 是否呼叫 _set_new_handler 所設定的新處理常式。 根據預設, malloc 不會在無法配置記憶體時呼叫新的處理程式例程。 您可以覆寫這個預設行為,因此,在 malloc 無法配置記憶體時,malloc 會呼叫新的處理常式,其方法與 new 運算子因相同原因而失敗時所執行的方法相同。 若要覆寫預設值,請在程式早期呼叫 _set_new_mode(1) 或連結 NEWMODE.OBJ (請參閱 連結選項)。

當應用程式與 C 執行時間連結庫的偵錯版本連結時, malloc 會解析為 _malloc_dbg。 如需如何在偵錯程式期間管理堆積的詳細資訊,請參閱 CRT 偵錯堆積詳細數據

malloc 標示 __declspec(noalias) 為 與 __declspec(restrict)。 這些屬性表示函式保證不會修改全域變數,而且傳回的指標不會有別名。 如需詳細資訊,請參閱 noaliasrestrict

根據預設,此函式的全域狀態會限定於應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態

需求

常式 必要的標頭
malloc <stdlib.h><malloc.h>

如需相容性詳細資訊,請參閱相容性

程式庫

所有版本的 C 執行階段程式庫

範例

// crt_malloc.c
// This program allocates memory with
// malloc, then frees the memory with free.

#include <stdlib.h>   // For _MAX_PATH definition
#include <stdio.h>
#include <malloc.h>

int main( void )
{
   char *string;

   // Allocate space for a path name
   string = malloc( _MAX_PATH );

   // In a C++ file, explicitly cast malloc's return.  For example,
   // string = (char *)malloc( _MAX_PATH );

   if( string == NULL )
      printf( "Insufficient memory available\n" );
   else
   {
      printf( "Memory space allocated for path name\n" );
      free( string );
      printf( "Memory freed\n" );
   }
}
Memory space allocated for path name
Memory freed

另請參閱

記憶體配置
calloc
free
realloc
_aligned_malloc