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