2012年10月29日月曜日

calloc & free

前回のプログラミング輪講で、領域確保の話が出てたので、ついでに使ってる関数の一部をのっけます。(これも、今年卒業した先輩からもらったものをいじっただけですが)

領域確保
int **imatrix(int row, int column)

{

  int i;

  int **x;

  

  x = (int**)calloc(row, sizeof(int*));

  for (i = 0;i < row;i++)

    x[i] = (int*)calloc(column,sizeof(int));



  //cheak

  if (x == NULL) {

    fprintf(stderr,"out of memory\n");

    exit(8);

  }



  return x;

}


領域解放
void i2dfree(int **p,int row,int column)

{

  int i;

 

  for (i = 0; i < row; i++)

    free(p[i]);

  free(p);

}


ここにあるのは、2次元int型用なので、double型・complex型も使いたい場合は、必要なところをint→double or complexに直して作ってください。

ちなみにmallocは領域確保のみですが、callocはmalloc後に初期化してくれます。



5 件のコメント :

  1. これはローカル変数のポインタを返しとるから本当はやらない方がいい。
    配列の確保を関数化したかったら、引数として確保したい変数のポインタを渡したほうがいいかも。
    参照URL貼っときます。
    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1426129389

    返信削除
  2. あとは、#defineでマクロを使って関数化したように見せるっていう手もあるな。

    返信削除
  3. コメントありがとうございます。

    引数として確保する方向で修正します。

    返信削除
  4. ちなみに「int **x」を「static int **x」とかにしてもダメなんでしょうか?

    返信削除
  5. staticを付けると、xをグローバル変数で定義したような感じになる。
    つまり実体としては1つしか存在しないことになって、何度関数を呼び出しても一つの変数の領域を何度も確保するだけになってしまう。

    返信削除