Namespaces
Variants

malloc

From cppreference.net
ヘッダーで定義 <stdlib.h>
void * malloc ( size_t size ) ;

size バイトの未初期化ストレージを割り当てます。

確保が成功した場合、あらゆるオブジェクト型に対して適切にアライメントされたポインタを返します。 fundamental alignment を持つオブジェクト型に対して適切にアライメントされています。

size がゼロの場合、 malloc の動作は実装定義です。例えば、nullポインタが返される可能性があります。あるいは、非nullポインタが返される可能性もあります。ただし、そのようなポインタは デリファレンス すべきではなく、メモリリークを避けるために free に渡すべきです。

malloc はスレッドセーフである:引数を通じて見えるメモリ位置のみにアクセスし、静的ストレージにはアクセスしないかのように振る舞う。

メモリ領域を解放する free free_sized 、および free_aligned_sized (C23以降) または realloc の以前の呼び出しは、同じまたは一部が同じメモリ領域を割り当てる malloc の呼び出しと 同期する 。この同期は、解放関数によるメモリへのアクセス後かつ malloc によるメモリへのアクセス前に発生する。各特定のメモリ領域を操作するすべての割り当て関数と解放関数には単一の全順序が存在する。

(C11以降)

目次

パラメータ

size - 割り当てるバイト数

戻り値

成功時は、新しく割り当てられたメモリの先頭へのポインタを返します。メモリリークを避けるため、返されたポインタは free() または realloc() で解放する必要があります。

失敗した場合、ヌルポインタを返します。

#include <stdio.h>   
#include <stdlib.h> 
int main(void) 
{
    int *p1 = malloc(4*sizeof(int));  // 4つのint配列用に十分なメモリを確保
    int *p2 = malloc(sizeof(int[4])); // 同じ、型を直接指定
    int *p3 = malloc(4*sizeof *p3);   // 同じ、型名を繰り返さずに
    if(p1) {
        for(int n=0; n<4; ++n) // 配列を初期化
            p1[n] = n*n;
        for(int n=0; n<4; ++n) // 配列の内容を出力
            printf("p1[%d] == %d\n", n, p1[n]);
    }
    free(p1);
    free(p2);
    free(p3);
}

出力:

p1[0] == 0
p1[1] == 1
p1[2] == 4
p1[3] == 9

参考文献

  • C17規格 (ISO/IEC 9899:2018):
  • 7.22.3.4 malloc関数 (p: 254)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.22.3.4 malloc関数 (p: 349)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.20.3.3 malloc関数 (p: 314)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.10.3.3 malloc関数

関連項目

以前に割り当てられたメモリを解放する
(関数)