malloc vs calloc:実践例で解説する主な違い
動的メモリ割り当てとは
動的メモリ割り当てにより、プログラムは実行時にメモリを要求・解放できます。C言語の標準ライブラリでは、malloc()、calloc()、realloc()、free()の4つの主要関数がstdlib.hで宣言されています。
malloc():単一ブロックのメモリ割り当て
malloc()(memory allocationの略)は連続したバイトブロックを確保し、先頭バイトへのポインタを返します。新しく割り当てられたブロックの内容は不定で、そのメモリ位置にたまたまあったビットパターンが含まれます。
典型的な使用例:
int *p = (int *)malloc(n * sizeof(int));
要求が失敗した場合、malloc()はNULLを返します。
calloc():ゼロ初期化された複数ブロックの割り当て
calloc()(contiguous allocationの略)は2つの引数(要素数と要素サイズ)を取り、全要素分のメモリを割り当て、全バイトをゼロで初期化します。クリーンな初期状態が必要な配列や構造体に最適です。
典型的な使用例:
int *p = (int *)calloc(n, sizeof(int));
malloc()と同様、失敗時はNULLを返します。
使い分けの指針
- malloc() — 単一ブロックが必要で、自分で初期化する場合。ゼロ初期化の手順をスキップする分、わずかに高速。
- calloc() — 配列や構造体で、全要素をゼロで開始させたい場合。自動初期化によりガベージ値の誤使用を防止。
構文の概要
malloc()
void *malloc(size_t size);
calloc()
void *calloc(size_t num, size_t size);
実践コード例
例1:malloc()で15個の整数を格納
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int *ptr = malloc(15 * sizeof(*ptr));
if (!ptr) {
perror("malloc failed");
return EXIT_FAILURE;
}
ptr[5] = 480; // 6番目の要素(0ベース)
printf("Value of the 6th integer is %d\n", ptr[5]);
free(ptr);
return EXIT_SUCCESS;
}
出力:Value of the 6th integer is 480
例2:calloc()で合計を計算
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int *ptr = calloc(10, sizeof(int));
if (!ptr) {
perror("calloc failed");
return EXIT_FAILURE;
}
int sum = 0;
for (int i = 0; i < 10; ++i) {
ptr[i] = i; // 初期化は冗長だが明示のため
sum += ptr[i];
}
printf("Sum = %d\n", sum);
free(ptr);
return EXIT_SUCCESS;
}
出力:Sum = 45
機能比較表
| 機能 | malloc() | calloc() |
|---|---|---|
| パラメータ数 | 1(サイズ) | 2(要素数、サイズ) |
| 割り当て後のメモリ状態 | 未初期化(ガベージ) | ゼロ初期化 |
| 典型的ユースケース | 単一ブロック、手動初期化 | 配列・構造体のクリーンな開始 |
| パフォーマンス | 高速(ゼロ初期化なし) | やや低速(ゼロ初期化オーバーヘッド) |
| 安全性 | ガベージ値使用のリスク高 | 自動ゼロ初期化でリスク低 |
| 失敗時の戻り値 | NULL | NULL |
| 標準ヘッダ | stdlib.h | stdlib.h |
まとめ
- 単一ブロックで自分で初期化する場合、わずかな性能向上のため
malloc()を使用 - 配列や構造体でゼロ初期化が必要な場合、バグ防止のため
calloc()を使用 - 両関数とも失敗時は
NULLを返すため、参照前に必ずチェック - 割り当てたメモリは
free()で解放し、メモリリークを防止
C言語
- C# の式、文、ブロック:実践例で徹底理解
- C++ do-while文:構文、実践例、ネストしたループ
- C++ポインタをマスター:概念、例、実践的応用
- C++ char型をマスター:宣言、ASCII、変換テクニック
- C++演算子オーバーロード:コード例付き実践ガイド
- C++関数を実例で徹底解説:基本から応用まで
- C#コレクション実践チュートリアル:実例で学ぶ柔軟なデータ管理
- while文 vs do-while文:実践例で明確に比較
- C言語のcalloc():ゼロ初期化メモリ割り当てと実践例
- Python str.count()マスター:文字と部分文字列のカウント実例集
- Python round()関数を実例で徹底解説