こんにちは、もがちゃんです。
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ポインタが返却される。