【C言語入門】callocの使い方

こんにちは、もがちゃんです。

C言語でメモリ領域を確保する場合、mallocを使用すると確保したメモリ領域の値は不定となりますが、メモリ領域の確保と確保したメモリ領域を0で初期化してくれる便利なcallocの使い方を簡単なサンプルソースとともに説明します。

callocの構文

#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);

callocの説明

calloc関数は、大きさがsizeであるオブジェクトのnmemb個の配列の領域を割り付ける。その領域のすべてのビットは、0で初期化する

JISX3010 プログラム言語C
nmemb

nmembには、sizeで指定したサイズの領域が何個必要か、個数を指定します。

size

sizeには、1単位あたりのバイトサイズを指定します。

返却値

nmemb * sizeで指定したサイズのメモリ領域確保に
成功した場合は、確保したメモリ領域の先頭ポインタを返します。
失敗した場合は、NULLポインタを返します。

calloc関数は、空ポインタ又は割り付けた領域へのポインタを返す。

JISX3010 プログラム言語C

callocの使い方サンプル

メモリ領域(小・中・大)を確保するだけのサンプルを紹介します。
小:32バイト*10個、中:32キロバイト*10個、大:32メガバイト*10個

サンプルプログラムと実行結果
#include <stdio.h>
#include <stdlib.h>

void memdump(void *p);

int main(int argc, char* argv[]) {
  void *p = NULL;
  /* 小サイズ */
  p = calloc((size_t)10, (size_t)32);
  if( p == NULL ) {
    fprintf( stdout, "calloc 10 * 32byte error!\n" );
    return -1;
  }
  memdump(p);
  free(p);  /* メモリ領域開放 */
  /* 中サイズ */
  p = calloc((size_t)10, (size_t)32*1024);
  if( p == NULL ) {
    fprintf( stdout, "calloc 10 * 32Kbyte error!\n" );
    return -1;
  }
  memdump(p);
  free(p);  /* メモリ領域開放 */
  /* 大サイズ */
  p = calloc((size_t)10, (size_t)32*1024*1024);
  if( p == NULL ) {
    fprintf( stdout, "calloc 10 * 32Mbyte error!\n" );
    return -1;
  }
  memdump(p);
  free(p);  /* メモリ領域開放 */
}

void memdump(void *p) {
  fprintf( stdout, "==== memdump start ====\n" );
  unsigned char *cp = NULL;
  int i = 0;
  for( cp = (char*)p, i = 0; i < 4; cp++, i++ ) {
    fprintf( stdout, "cp[%p]:%02x\n", cp, *cp );
  }
  fprintf( stdout, "==== memdump end ====\n\n" );
}
サンプルプログラムの実行結果
サンプルプログラムの実行結果

確保したメモリ領域の先頭4バイトだけ表示していますが、0で初期化されていますね。

callocの使い方まとめ

  • callocを使用する際は、nmembとsizeでメモリ領域を確保するサイズを指定する。(nmemb * size)
  • callocで確保されたメモリ領域は、0で初期化される。
  • callocで確保したメモリ領域が不要となった場合は、freeで解放する必要がある。
  • callocの返却値は、領域確保に成功した場合、確保した領域の先頭を指すポインタが返却され、領域確保に失敗した場合は、NULLポインタが返却される。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA