この記事は「渡部 Advent Calendar 2025」の20日目の記事です。
結論
malloc が失敗すると NULL を返す。 何も起きないわけではなく、「何も確保されなかった」という状態になる。
malloc が失敗する条件
malloc(size) は、次のような条件で失敗します。
- 要求サイズを満たす 連続した仮想アドレス空間 が確保できない
- OS やランタイムの制限に引っかかる
代表的な例としては以下があります。
- プロセスの仮想メモリ上限(ulimit -v)
- cgroup / コンテナの memory limit
- メモリの断片化(巨大な連続領域が取れない)
- overcommit 無効(vm.overcommit_memory=2)
失敗したときに何が起きるか
C 標準としての挙動
void *p = malloc(1024); if (p == NULL) { // 失敗 }
失敗した場合、必ず NULL が返る。errno は 未規定(当てにしてはいけない)
ここで p を使った瞬間
*p = 1; // ← 未定義動作(ほぼ確実に SEGV)
malloc が失敗しているのに、その戻り値を使った瞬間、プログラムは 未定義動作 に突入します。(SEGVする)
まとめ
malloc が失敗すると NULL を返す。でも 成功しても安全とは限らない。実際に死ぬのは「メモリを触った瞬間」。Linux / コンテナ環境では OOM killer による突然死 が起きる。低レイヤを触るなら、
- 「malloc の失敗」より
- 「成功したあとに何が起きるか」
を常に意識しておく必要があると思います。