第51章 calloc()

 malloc() はヒープ領域に割り当てをしてくれますが、値を 0 に初期化はしてくれません。

 配列の値が 0 という計算をする時は一々ループで初期化するのも面倒ですよね。

 てなことで calloc() という 0 初期化をしてくれるヒープ割り当て関数があります。

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

 nmemb は割り当てたい要素数、size は各要素のバイトサイズとなります。

 まあ、簡単なので calloc() を使ったコードを考えてみましょう。

main.c. 

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 int main()
  5 {
  6   int i;
  7   int *foo = calloc(4,sizeof(int));
  8   for(i = 0; i < 4; i++)
  9     printf("%d : 0x%lx\n",foo[i],(unsigned long)&foo[i]);
 10   free(foo);
 11   return 0;
 12 }

ビルドと実行結果. 

$ gcc main.c
$ ./a.out
0 : 0x55bd7a881260
0 : 0x55bd7a881264
0 : 0x55bd7a881268
0 : 0x55bd7a88126c

 このコードで calloc() をコールしているのが以下の行です。

  7   int *foo = calloc(4,sizeof(int));

 整数型 4 つ分のメモリーを割り当ててます。

 さらに malloc() と違い foo が指すアドレスの値はゼロ初期化が行われています。

 確認のために値とアドレスを併記する出力をさせます。

  8   for(i = 0; i < 4; i++)
  9     printf("%d : 0x%lx\n",foo[i],(unsigned long)&foo[i]);

 実行結果を見ると、アドレスは 4 バイトで連続スライドしています。

 値も全て 0 となっていますね。

Copyright 2018-2019, by Masaki Komatsu