Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のcalloc関数とは?mallocとの違いと使い方をわかりやすく解説

C言語の標準ライブラリ関数 void *calloc(size_t nitems, size_t size) は、要求されたメモリ領域を確保し、その先頭アドレスを指すポインタを返します。

malloccalloc の最大の違いは、mallocが確保したメモリを初期化せずに返すのに対し、callocは確保したメモリをすべてゼロで初期化してから返すという点です。

メモリ確保の2つの方法

C言語におけるメモリ確保には、大きく分けて以下の2つの方法があります。

C言語のcalloc関数とは?mallocとの違いと使い方をわかりやすく解説

1. 静的メモリ確保(コンパイル時)

コンパイルの時点でメモリを確保する方法です。一度確保したメモリは実行中に変更できないため、メモリ不足メモリの無駄遣いといった問題が発生しやすくなります。

2. 動的メモリ確保(実行時)

プログラムの実行中に、ユーザーの要求に応じて必要な分だけメモリを確保する方法です。これにより、メモリを効率的かつ柔軟に利用できます。

動的メモリ管理用の標準ライブラリ関数

C言語で動的メモリ管理に使われる主な標準ライブラリ関数は以下の4つです。

  • malloc():指定したバイト数のメモリを確保する
  • calloc():複数の要素分の連続したメモリを確保し、ゼロで初期化する
  • realloc():すでに確保したメモリのサイズを変更する
  • free():確保したメモリを解放する

calloc() 関数の特徴

  • 実行時(ランタイム)に連続したメモリブロックを確保するために使用します。
  • 特に配列のために設計された関数です。
  • void型ポインタを返し、このポインタは確保されたメモリの先頭アドレス(ベースアドレス)を指します。

calloc() の構文

void *calloc(要素数, 1要素あたりのバイト数);

calloc() の基本的な使い方

以下は calloc() 関数の基本的な使用例です。

int *ptr;
ptr = (int *) calloc(500, 2);

この例では、2バイトのメモリブロックが500個連続して確保されます。合計確保メモリ量は1000バイトです。

C言語のcalloc関数とは?mallocとの違いと使い方をわかりやすく解説

実際の開発では、sizeof 演算子を使って次のように書くのが一般的です。環境に依存せず移植性が高まるため、こちらの書き方が推奨されます。

int *ptr;
ptr = (int *) calloc(n, sizeof(int));

サンプルプログラム

以下は、動的メモリ確保関数 calloc を使って、入力された一連の整数の中から偶数の合計奇数の合計をそれぞれ求めるCプログラムです。

#include<stdio.h>
#include<stdlib.h>

int main(void){
    // 変数とポインタの宣言 //
    int i, n;
    int *p;
    int even = 0, odd = 0;

    // 要素数の読み込み //
    printf("Enter the number of elements : ");
    scanf("%d", &n);

    // callocを使ってメモリを確保し、先頭アドレスをpに代入 //
    p = (int *) calloc(n, sizeof(int));

    /* メモリが正常に確保できたかどうかを確認するため
       NULLチェックを行う */
    if (p == NULL){
        printf("Memory not available");
        exit(0);
    }

    // forループで要素を読み込み、配列に格納 //
    printf("The elements are : \n");
    for(i = 0; i < n; i++){
        scanf("%d", p + i);
    }

    // 偶数と奇数の合計をそれぞれ計算 //
    for(i = 0; i < n; i++){
        if(*(p + i) % 2 == 0){
            even = even + *(p + i);
        } else {
            odd = odd + *(p + i);
        }
    }

    printf("The sum of even numbers is : %d\n", even);
    printf("The sum of odd numbers is : %d\n", odd);

    // メモリの解放 //
    free(p);
    return 0;
}

なお、上記のコードでは calloc を呼び出す前に要素数 n を読み込むよう順序を整理しています。また、確保したメモリを使い終わった後に free() で解放することで、メモリリークを防いでいます。

実行結果

上記のプログラムを実行すると、以下のような出力が得られます。

Enter the number of elements : 4
The elements are :
12
56
23
10
The sum of even numbers is : 78
The sum of odd numbers is : 23

まとめ

calloc関数は、配列のように連続したメモリ領域をゼロクリア付きで確保したい場合に便利な関数です。mallocとの違い(ゼロ初期化の有無)を理解し、NULLチェックやfree()による解放を組み合わせて、安全に動的メモリを活用しましょう。

  1. C言語のstrcmp()関数とは?文字列比較の基本と使い方を徹底解説

    C言語の標準ライブラリ関数 int strcmp(const char *str1, const char *str2) は、ポインタ str1 が指し示す文字列と、str2 が指し示す文字列を比較するための関数です。C言語において、文字型の配列は「文字列」と呼ばれます。まずは文字列の基本的な扱い方から確認していきましょう。文字列の宣言文字列(文字配列)の宣言は以下のように行います。char stringname [size];例えば、char string[50]; と宣言すれば、最大50文字の長さを持つ文字列を格納できます。文字列の初期化文字列の初期化には、主に次の2つの方法があります。1

  2. C#プログラミングとは?初心者にもわかる特徴と基本を徹底解説

    C#(シーシャープ)とは何かC#は、Microsoft(マイクロソフト)が開発したモダンで汎用性の高いオブジェクト指向プログラミング言語です。Windowsアプリケーションの開発をはじめ、Webサービス、ゲーム開発(Unity)、業務システムなど、幅広い分野で活用されています。C#は「共通言語基盤(CLI:Common Language Infrastructure)」向けに設計されています。CLIは実行可能なコードとランタイム環境から構成されており、これにより異なるコンピュータプラットフォームやアーキテクチャ上で、さまざまな高水準言語を利用できるようになっています。C#の主な特徴C#には、開