calloc

[機能]

  要素を 0 に初期設定した状態でメモリ内に領域を割り当てます.malloc 関数との違いは,初期設定がされる点と,バイト単位以外でも割り当てることができる点です.割り当てに成功すると割り当てられた領域へのポインタを返し,失敗すると NULL が返されます.

[形式]
#include <stdlib.h>

void *calloc(size_t num, size_t size)
	num  : 要素の数
	size : 各要素のサイズ		
[使用例]

  1. 領域の確保,再確保,及び,解放
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	int i1, *k1;
    /*
    		 int型整数の10個の配列を確保
    			    callocを使用(0で初期化される)
    */
    	k1 = (int *)calloc(10, sizeof(int));
    /*
    		 最初の5個に1から5を代入
    */
    	for (i1 = 0; i1 < 5; i1++)
    		k1[i1] = i1 + 1;
    	for (i1 = 0; i1 < 10; i1++)
    		printf("%2d ", k1[i1]);
    	printf("\n");
    /*
    		 配列のサイズを15に変更(10個目までのデータは保存される)
    */
    	k1 = (int *)realloc((void *)k1, 15*sizeof(int));    /* intを15個 */
    	for (i1 = 0; i1 < 15; i1++)
    		printf("%2d ", k1[i1]);
    	printf("\n");
    /*
    		 領域の解放
    */
    	free((void *)k1);
    /*
    		 int型整数の10個の配列を確保
    			    mallocを使用(内容は未定)
    */
    	k1 = (int *)malloc(10*sizeof(int));                 /* intを10個 */
    	for (i1 = 0; i1 < 10; i1++)
    		printf("%2d ",k1[i1]);
    	printf("\n");
    
    	return 0;
    }
    			
    (出力)
     1  2  3  4  5  0  0  0  0  0 
     1  2  3  4  5  0  0  0  0  0  0 33 1627793056 1627793056  0 
    1627793104 1627793104  3  4  5  0  0  0  0  0 			
  2. 1 次元配列( new )
    #include <stdio.h>
    
    int main()
    {
    	int i1, n, sum = 0, *x;
    /*
    					データの数
    */
    	printf("データの数は? ");
    	scanf("%d", &n);
    /*
    					領域の確保
    */
    	x = new int [n];
    /*
    					データの入力と和の計算
    */
    	for (i1 = 0; i1 < n; i1++) {
    		printf("   %d 番目のデータを入力してください ", i1+1);
    		scanf("%d", &x[i1]);
    		sum += x[i1];
    	}
    
    	printf("和 = %d\n", sum);
    /*
    					領域の開放
    */
    	delete [] x;
    
    	return 0;
    }
    			
    (出力)
    データの数は? 3
       1 番目のデータを入力してください 1
       2 番目のデータを入力してください 2
       3 番目のデータを入力してください 3
    和 = 6			
  3. 2 次元配列( new )

      calloc や malloc を使用しても同様に可能です.
    #include <stdio.h>
    
    int main()
    {
    	int i1, i2, m, n, *mean, **ten;
    /*
    					データの数
    */
    	printf("クラスの人数は? ");
    	scanf("%d", &n);
    	printf("科目の数は? ");
    	scanf("%d", &m);
    /*
    					領域の確保
    */
    	ten  = new int * [n];
    	mean = new int [m];
    
    	for (i1 = 0; i1 < m; i1++)
    		mean[i1] = 0;
    /*
    					データの入力と和の計算
    */
    	for (i1 = 0; i1 < n; i1++) {
    		ten[i1] = new int [m];   // 学生毎に科目数を変えることも可能
    		printf("   %d 番目の学生\n", i1+1);
    		for (i2 = 0; i2 < m; i2++) {
    			printf("      %d 番目の科目の点数は? ", i2+1);
    			scanf("%d", &ten[i1][i2]);
    			mean[i2] += ten[i1][i2];
    		}
    	}
    /*
    					平均の出力
    */
    	printf("各科目の平均点は以下の通りです\n    ");
    	for (i1 = 0; i1 < m; i1++)
    		printf(" %d", mean[i1]/n);
    	printf("\n");
    /*
    					領域の開放
    */
    	for (i1 = 0; i1 < n; i1++)
    		delete [] ten[i1];
    	delete [] ten;
    	delete [] mean;
    
    	return 0;
    }
    			
    (出力)
    クラスの人数は? 2
    科目の数は? 3
       1 番目の学生
          1 番目の科目の点数は? 10
          2 番目の科目の点数は? 20
          3 番目の科目の点数は? 30
       2 番目の学生
          1 番目の科目の点数は? 40
          2 番目の科目の点数は? 50
          3 番目の科目の点数は? 60
    各科目の平均点は以下の通りです
         25 35 45
    			
[参照]

malloc, realloc, free

菅沼ホーム 本文目次 演習問題解答例 付録目次 索引