• ベストアンサー

「動的確保した2次元配列のメモリ解放」を関数化したい

質問タイトルの通りですが、 「動的確保した2次元配列のメモリ解放」をC言語で関数化したいと思っています。しかし、関数の引数には動的確保した配列の先頭アドレスのみ渡す形にしたいです。そのような場合の関数化は可能ですか? どうもうまくいかず、困っています。 以下、具体的に、サンプルソースを記述します。 わかる方、よろしくお願いします。 //====================================================// #include<stdio.h> unsigned char** AllocByteArray2d(int column, int row); void FreeByteArray2d(unsigned char** box); int main(voidls){ unsigned char array**; array = AllocByteArray2d(2, 3); FreeByteArray2d(array); return 0; } unsigned char** AllocByteArray2d(int column, int row){ unsigned char* box; box = (unsigned char**)malloc( sizeof(unsigned char*)*column ) int i; for(i=0; i<column; i++){ box[i] = (unsigned char*)calloc( row, sizeof(unsigned char)); if(box[i] == NULL) exit(EXIT_FAILURE); } return box; } //引数では配列の先頭アドレスだけ渡す形にしたい void FreeByteArray2d(unsigned char** box){ //ここをどう書いたらいいかわからない }

質問者が選んだベストアンサー

  • ベストアンサー
  • hidebun
  • ベストアンサー率50% (92/181)
回答No.4

番兵。

g47040
質問者

お礼

番兵!その手がありましたね。。。 調べて手を加えたら、完成しました!!! 一応、ソース載せておきます。どうもありがとうございました。 //====================================================// #include<stdio.h> #include<stdlib.h> unsigned char** AllocByteArray2d(int column, int row); void FreeByteArray2d(unsigned char** box); int main(void){ unsigned char **array = AllocByteArray2d(2, 3); FreeByteArray2d(array); return 0; } unsigned char** AllocByteArray2d(int column, int row){ unsigned char **box; box = (unsigned char**)malloc( sizeof(unsigned char*)*column ); int i; for(i=0; i<column; i++){ box[i] = (unsigned char*)calloc( row, sizeof(unsigned char)); if(box[i] == NULL) exit(EXIT_FAILURE); } return box; } //引数では配列の先頭アドレスだけ渡す形にしたい void FreeByteArray2d(unsigned char** box){ int i=0; while( box[i] != '\0' ){ free( box[i] ); i++; } free( box[i] ); }

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

現在のままでは不可能です. AllocByteArray2d で malloc する回数と FreeByteArray2d で free する回数とは等しくなければなりません. ということで, malloc の回数が引数 column に依存する以上, free するときにもこの値が必要です. ただし, AllocByteArray2d を書き換えれば「先頭アドレスだけを渡す」形で書くこともできます.

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>どうもうまくいかず、困っています。 どのようにうまくいかなくてお困りですか? コンパイルが通るサンプルソースとともに示してください。 今のサンプルソースはコンパイルできません。

g47040
質問者

補足

すいません、ソースの載せ間違いでした。 正しくは、下に貼っつけたソースになります。 ごめんなさい。

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.1

関数化する前の「動的確保した2次元配列のメモリ解放」のソースがないよ? 質問タイトル見て、てっきり関数化してないものはできてるのかと思ったんだけど。 あと、 > int main(voidls){ これは変。

g47040
質問者

補足

失礼致しました!!!  上記のソースはうろ覚えでコンパイルせずに打ち込んだやつでした。正しくは下のソースになります。下のソースは動作確認済です。 よろしくお願いします。 //====================================================// #include<stdio.h> #include<stdlib.h> unsigned char** AllocByteArray2d(int column, int row); void FreeByteArray2d(unsigned char** box); int main(void){ unsigned char **array = AllocByteArray2d(2, 3); //FreeByteArray2d(array); int i=0; for(i=0; i<2; i++){ free( array[i] ); } free( array ); return 0; } unsigned char** AllocByteArray2d(int column, int row){ unsigned char **box; box = (unsigned char**)malloc( sizeof(unsigned char*)*column ); int i; for(i=0; i<column; i++){ box[i] = (unsigned char*)calloc( row, sizeof(unsigned char)); if(box[i] == NULL) exit(EXIT_FAILURE); } return box; } //引数では配列の先頭アドレスだけ渡す形にしたい void FreeByteArray2d(unsigned char** box){ //ここをどう書いたらいいかわからない }

関連するQ&A