malloc
更新 : 2007 年 11 月
メモリ ブロックを割り当てます。
void *malloc(
size_t size
);
パラメータ
- size
割り当てるバイト数。
戻り値
malloc 関数は、割り当てられた領域への void ポインタを返します。メモリが足りない場合は NULL を返します。void 以外の型へのポインタを得るには、戻り値に型キャストを行います。戻り値が指す記憶領域は、どの型のオブジェクトを格納する場合でも、適切に配置されます。size が 0 の場合、malloc 関数は長さが 0 のアイテムをヒープに割り当て、そのアイテムへの有効なポインタを返します。要求したメモリ量が少ない場合でも、必ず malloc 関数からの戻り値をチェックしてください。
解説
malloc 関数は、少なくとも size で指定したバイトのメモリ ブロックを割り当てます。アラインメントや保守情報の領域が必要な場合、size で指定したバイトよりメモリ ブロックが大きくなることもあります。
Visual C++ 2005 では、メモリ割り当てが失敗するか、または要求されたメモリ量が _HEAP_MAXREQ を超える場合、malloc は errno を ENOMEM に設定します。このエラー コードおよびその他のエラー コードの詳細については、「errno、_doserrno、_sys_errlist、および _sys_nerr」を参照してください。
スタートアップ コードでは、malloc 関数を使用して _environ、envp、および argv の各変数の記憶領域を割り当てます。以下の関数と対応するワイド文字バージョンも malloc 関数を呼び出します。
|
|||
|
C++ の _set_new_mode 関数は、malloc 関数の new ハンドラのモードを設定します。メモリの割り当てに失敗した場合、new ハンドラのモードに応じて、malloc 関数が _set_new_handler で設定されている new ハンドラ ルーチンを呼び出すかどうかが決まります。既定では、malloc 関数はメモリの割り当てに失敗しても new ハンドラ ルーチンを呼び出しません。既定の動作をオーバーライドすると、new 演算子がメモリの割り当てに失敗したときと同じように、malloc 関数がメモリの割り当てに失敗したときにも、malloc 関数は new ハンドラのルーチンを呼び出すことができます。既定の動作をオーバーライドするには、プログラムの始めの方で次の関数を呼び出すか、または NEWMODE.OBJ とリンクします。
_set_new_mode(1)
「リンク オプション」を参照してください。
アプリケーションを C ランタイム ライブラリのデバッグ バージョンとリンクすると、malloc は _malloc_dbg に置き換わります。デバッグ中のヒープの処理方法の詳細については、「CRT デバッグ ヒープ」を参照してください。
malloc には __declspec(noalias) と __declspec(restrict) のマークが付けられます。これは、関数がグローバル変数を変更しないことを保証し、返されるポインタがエイリアス指定されないことを意味します。詳細については、「noalias」および「restrict」を参照してください。
必要条件
ルーチン |
必須ヘッダー |
---|---|
malloc |
<stdlib.h> および <malloc.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
ライブラリ
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
.NET Framework の相当するアイテム
適用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。