工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

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()

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 vs calloc:実践例で解説する主な違い

機能malloc()calloc()
パラメータ数1(サイズ)2(要素数、サイズ)
割り当て後のメモリ状態未初期化(ガベージ)ゼロ初期化
典型的ユースケース単一ブロック、手動初期化配列・構造体のクリーンな開始
パフォーマンス高速(ゼロ初期化なし)やや低速(ゼロ初期化オーバーヘッド)
安全性ガベージ値使用のリスク高自動ゼロ初期化でリスク低
失敗時の戻り値NULLNULL
標準ヘッダstdlib.hstdlib.h

まとめ

C言語

  1. C# の式、文、ブロック:実践例で徹底理解
  2. C++ do-while文:構文、実践例、ネストしたループ
  3. C++ポインタをマスター:概念、例、実践的応用
  4. C++ char型をマスター:宣言、ASCII、変換テクニック
  5. C++演算子オーバーロード:コード例付き実践ガイド
  6. C++関数を実例で徹底解説:基本から応用まで
  7. C#コレクション実践チュートリアル:実例で学ぶ柔軟なデータ管理
  8. while文 vs do-while文:実践例で明確に比較
  9. C言語のcalloc():ゼロ初期化メモリ割り当てと実践例
  10. Python str.count()マスター:文字と部分文字列のカウント実例集
  11. Python round()関数を実例で徹底解説