C言語 動的メモリを0クリアして確保 - stdlib.h - [ calloc ]

2008.11.01 Saturday | by LRESULT


的メモリの確保の第二弾は、calloc()です。

※ 第一弾 malloc()は、こちら
※ 第三弾 realloc()は、こちら
※ 第四弾 free()は、こちら

calloc()も、メモリを動的に確保し、配列のように扱えますが、
malloc()との違いは、動的メモリを確保した時点で、0で初期化してくれる(0クリア)ところです。

calloc()も、動的メモリを確保して必要なくなれば、必ず解放処理( free() )をしなければなりません。


calloc
書式 void* calloc( size_t num, size_t size )
機能 動的メモリの確保をして0で初期化する
引数 size_t num : 確保する領域の個数
size_t
size : 1つの領域のバイト数
戻り値 成功すると、確保した領域のポインタを返し
失敗すると、NULLを返します。


malloc()との違いは、引数num には領域の個数、引数size には1つの領域のバイト数を
指定するところです。malloc()の場合には、バイト数でまとめて取得していました。




サンプルコード
calloc()は、0で初期化してくれる所がmalloc()との大きな違いなので、
malloc()とcalloc()で動的メモリを確保し、本当に0クリアされているかを見てみます。

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

int main(void)
{
  int *mbuf = NULL;
  int *cbuf = NULL;
  int i, sz;

  sz = 10 * sizeof( int );
  mbuf = (int *)malloc( sz );
  if( mbuf == NULL ){
    printf( "メモリ確保に失敗しました¥n" );
    return -1;
  }

  cbuf = (int *)calloc( 10, sizeof( int ) );
  if( cbuf == NULL ){
    printf( "メモリ確保に失敗しました¥n" );
    return -1;
  }

  for( i=0; i<10; i++ ){
    printf( "i=%d, mbuf[i]=%d, cbuf[i]=%d¥n", i, mbuf[i], cbuf[i] );
  }

  free( mbuf );
  free( cbuf );

  return 0;
}




結果
i=0, mbuf[i]=-842150451, cbuf[i]=0
i=1, mbuf[i]=-842150451, cbuf[i]=0
i=2, mbuf[i]=-842150451, cbuf[i]=0
i=3, mbuf[i]=-842150451, cbuf[i]=0
i=4, mbuf[i]=-842150451, cbuf[i]=0
i=5, mbuf[i]=-842150451, cbuf[i]=0
i=6, mbuf[i]=-842150451, cbuf[i]=0
i=7, mbuf[i]=-842150451, cbuf[i]=0
i=8, mbuf[i]=-842150451, cbuf[i]=0
i=9, mbuf[i]=-842150451, cbuf[i]=0
環境によって、表示される値は変わると思いますが、
このように、malloc()で確保した領域には不定な値が入り、
calloc()で確保した領域は、0クリアされている事が確認出来ました。

カテゴリ:C言語 stdlib.h | 17:51 | comments(0) | trackbacks(0) | -


コメントする











この記事のトラックバックURL

http://simd.jugem.jp/trackback/98

トラックバック