calloc*

[機能]

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

  Java には対応するメソッドがありませんが,C++ と同様,new 演算子によって動的にメモリを確保することが可能です.

[形式]
	#include <stdlib.h>

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

  1. 領域の確保,再確保,及び,解放(C/C++)
    #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 )(C++)
    #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. 1 次元配列( new )(Java)
    import java.io.*;
    
    public class Test {
    	public static void main(String args[])
    	{
    		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    		int i1, n, sum = 0, x[];
    
    		try {
    	/*
    						データの数
    	*/
    			System.out.print("データの数は? ");
    			n = Integer.parseInt(in.readLine());
    	/*
    						領域の確保
    	*/
    			x = new int [n];
    	/*
    						データの入力と和の計算
    	*/
    			for (i1 = 0; i1 < n; i1++) {
    				System.out.print("   " + (i1+1) + " 番目のデータを入力してください ");
    				x[i1] = Integer.parseInt(in.readLine());
    				sum  += x[i1];
    			}
    			System.out.println("和 = " + sum);
    		}
    		catch (IOException ignored) {}
    	}
    }
    			
    (出力)
    データの数は? 3
       1 番目のデータを入力してください 1
       2 番目のデータを入力してください 2
       3 番目のデータを入力してください 3
    和 = 6
    			
  4. 2 次元配列( new )(C++)

      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
    			
  5. 2 次元配列( new )(Java)
    import java.io.*;
    
    public class Test {
    	public static void main(String args[])
    	{
    		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    		int i1, i2, m, n, mean[], ten[][];
    
    		try {
    	/*
    						データの数
    	*/
    			System.out.print("クラスの人数は? ");
    			n = Integer.parseInt(in.readLine());
    			System.out.print("科目の数は? ");
    			m = Integer.parseInt(in.readLine());
    	/*
    						領域の確保
    	*/
    			ten  = new int [n][m];
    	//		ten  = new int [n][0];   行毎に列数を変えたい場合
    			mean = new int [m];
    
    			for (i1 = 0; i1 < m; i1++)
    				mean[i1] = 0;
    	/*
    						データの入力と和の計算
    	*/
    			for (i1 = 0; i1 < n; i1++) {
    	//			ten[i1] = new int [m];   行毎に列数を変えたい場合
    				System.out.println("   " + (i1+1) + " 番目の学生");
    				for (i2 = 0; i2 < m; i2++) {
    					System.out.print("      " + (i2+1) + " 番目の科目の点数は? ");
    					ten[i1][i2] = Integer.parseInt(in.readLine());
    					mean[i2] += ten[i1][i2];
    				}
    			}
    	/*
    						平均の出力
    	*/
    			System.out.print("各科目の平均点は以下の通りです\n    ");
    			for (i1 = 0; i1 < m; i1++)
    				System.out.print(" " + mean[i1]/n);
    			System.out.print("\n");
    		}
    		catch (IOException ignored) {}
    	}
    }
    			
    (出力)
    クラスの人数は? 2
    科目の数は? 3
       1 番目の学生
          1 番目の科目の点数は? 10
          2 番目の科目の点数は? 20
          3 番目の科目の点数は? 30
       2 番目の学生
          1 番目の科目の点数は? 40
          2 番目の科目の点数は? 50
          3 番目の科目の点数は? 60
    各科目の平均点は以下の通りです
         25 35 45
    			
[参照]

malloc, realloc, free

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