• ベストアンサー

配列動的確保

結論から申しますと,aaa[値1][値2][値3][値4]配列を動的に確保したいのです. unsigned short *****aaa; という方法では確保できるのですが,unsigned short ****aaaとようにしてできるのでしょうか? この他にも違う方法があればご教授ください. どうぞよろしくお願いいたします.

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

  • ベストアンサー
  • Zozomu
  • ベストアンサー率22% (123/545)
回答No.1

unsigned short ****aaa; では、アドレスを保存する領域は確保されますが、 実際にデータを格納するメモリ領域まで確保される訳ではありません。 malloc関数でメモリ領域を確保しないと、 何時アプリケーションエラーを起こすかわからない 危険なプログラムが出来上がります。 aaa = malloc( sizeof( unsigned short **** ) * 値1 ) ; for (i=0 ; i<値1 ; i++ ) { aaa[i] = malloc( sizeof( unsigned short *** ) * 値2 ) ; for (j=0 ; j<値2 ; j++ ) { aaa[i][j] = malloc( sizeof( unsigned short ** ) * 値3 ) ; for (k=0 ; k<値3 ; k++ ) { aaa[i][j][k] = malloc( sizeof( unsigned short * ) * 値4 ) ; for (l=0 ; l<値4 ; l++ ) { aaa[i][j][k][l] = malloc( sizeof( unsigned short ) ) ; } } } } こんな感じで領域確保をしないと駄目です。 これは処理の途中で値1~4の値が全てわかる時の例です。 処理が進むたびに領域が必要になる場合は、 当然のことながら、その都度メモリ領域を確保する様にしなければなりません。

graduate_student
質問者

お礼

早速の回答ありがとうございます. malloc関数,知りませんでした. 以後気をつけたいと思います.

その他の回答 (1)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

unsigned short (*aaa)[値2][値3][値4] = malloc(sizeof(unsigned short [値1][値2][値3][値4]));

graduate_student
質問者

お礼

やはりmalloc関数を使うのですね. ありがとうございました.

関連するQ&A

  • 2次元配列の動的確保

    ある画像を読み込むため、その画像を格納できる幅、高さを持った配列を動的に確保しようと考えています。 幅をxsize、高さをysizeで次のように記述しました。 unsigned char **src; int i; src = (unsigned char**)malloc(sizeof(unsigned char*) * ysize); src[0] = (unsigned char*)malloc(sizeof(unsigned char) * xsize * ysize); for(i=1; i<ysize; i++) src[i] = (src[0] + i * xsize); わざわざポインタのポインタを使用したのは、動的に確保した配列を2次元的なアクセスをしたかったためです。 画像の読み込み時は fread(src[0], sizeof(unsigned char), xsize * ysize, fp); としています。 上に記述したソースは問題なく動作しました。 しかし、上の場合だと全ての配列を連続して確保することができません。つまりsrcでmallocを一回、src[0]でmallocを一回使っているため、ポインタの配列の直後に配列を確保する保障がありません。そこでいっぺんに確保することを考えました。 unsigned char **src; int i; src = (unsigned char **)malloc(sizeof(unsigned char *) * ysize + sizeof(unsigned char) * xsize * ysize); for(i=0; i<ysize; i++) src[i] = (unsigned char *)(src + sizeof(unsigned char *) * ysize + i * xsize); このように組み上げ、読み込み時は上のfreadと同様に記述したところエラーが出てしまいました。 やはり一行目のmallocで無理やりsizeof(unsigned char *) * ysize + sizeof(unsigned char) * xsize * ysize分確保するのは失敗だったのでしょうか?

  • C++/CLIの構造体のコンストラクタについて

    C++/CLIの構造体のコンストラクタについて C++/CLIで、固定サイズの配列を持つ構造体を、次のようにコーディングして使っています。 value struct AAA { public:   array<unsigned short>^ m1;   AAA(unsigned short dummy)   {     m1 = gcnew array<unsigned short>(4);   } }; AAA ^struct0 = gcnew AAA(0); この方法で正常に動作するのですが、2点ほど気になる点があります。 (1) コンストラクタAAA(unsigned short dummy)を実装しなくても済む方法がないか? (2) この方法では、struct0を、ネイティブヒープ領域に割り当てられない (AAA *struct0 = new AAA(0))でコンパイルエラー) (1)と(2)は関連する気もするのですが、これらを解決する方法はあるのでしょうか?

  • 画像を読み込む配列の確保。

    C言語について質問です。 画像を読み込む時、その画像の幅、高さを入力し、そのサイズに見合った配列を確保します。その後ファイル名を入力し、配列に読み込むプログラムを作成しました。 メインの部分のみ記述します。 int xsize, ysize, i; unsigned char **src; char filename[30]; FILE *fp; printf("ファイル名を入力してください:"); scanf("%s", filename); printf("画像の幅:");scanf("%d", &xsize); printf("画像の高さ:");scanf("%d", &ysize); src = (unsigned char **)malloc(sizeof(unsigned char *) * ysize); for(i=0; i<ysize; i++) src[i] = (unsigned char *)malloc(sizeof(unsigned char) * xsize); fp = fopen(filename, "rb"); fread(src[0], sizeof(unsigned char), xsize * ysize, fp); このように記述し、エラーもなく実行できたのですが、srcをこのまま出力すると変?な画像となって出力されてしまいました。 上のように記述した場合、矛盾する場所はあるでしょうか? そして、この方法以外に配列を確保する方法はあるでしょうか?

  • 多次元配列から任意の配列を取り出す

    すいません。phpを初めて勉強中なのですが、少し分からない事があります。 例えば以下のような二次元配列なのですが、私がやりたい事は「キーを使った並び替え」と 「特定のキーの排除」を行い、任意の順番でテキストを展開させたいです。 foreachで回して配列をソートし3つのテキストを展開するまではできたのですが、 キーが「y」となっている配列のみを抜き出すというのがどうすれば良いのでしょう? いろいろサイトを見てるのですが、特定のキーが入っている配列を抜き出す(または排除) というのは無く、値を抜き出すなどしかありません・・。 $food["1"]["y"]= "aaa1.txt"; $food["2"]["e"]= "aaa2.txt"; $food["3"]["y"]= "aaa3.txt"; $food["4"]["y"]= "aaa4.txt"; ↓ $food["1"]["y"]= "aaa1.txt"; $food["3"]["y"]= "aaa3.txt"; $food["4"]["y"]= "aaa4.txt";

    • ベストアンサー
    • PHP
  • 配列の書き方

    C言語の配列の宣言で unsigned char aaa[256/8] という表現があるのですが、これはどういう意味でしょうか?

  • 2次元配列を確保したいのですが、

    2次元配列を確保したいのですが、 size of array 'buf' is too large というエラーで確保できません。 mallocを使って確保しようとしましたが、コンパイルできましたが、 実行するとメモリ確保に失敗します。 大きな2次元配列を確保する方法を教えてください。

  • C++で逐次動的に配列を確保

    C++初心者です。 よろしくお願いします。 あるクラスのポインタのリストがあって、末端にはNULLを入れてます。 そのリストをNULLが来るまでfor文で回して クラスのメンバを別で用意した配列に逐次代入したいのですが リスト内に何個クラスがあるのか分からないので、配列を確保できません。 一度回しきってクラスの数を数えてからその分を確保して もう一度回して代入すれば解決は出来ると思うのですが やはり効率が悪いと思うので 効率よく配列を確保できる方法がございましたらご教授よろしくお願いします。

  • C言語の配列の扱い

    次のような配列bufと変数dataを宣言して bufの中身をdataにコピーしたいのですが、 buf[0]のみで、buf[1]の値が入りません。 具体的には、buf[0]には16進数で0x3f、 buf[1]には0x3aが入っていて、 dataの値を0x3a3fにしたいのです。 教えてください。 ***************************** unsigned char buf[2]; unsigned short data; data = (unsigned short)*buf; *****************************

  • 配列の置き換え

    PHPで教えて欲しいです。 例えば、 $aaa = Array ( [0] => Array ( [id] => 1 [date] => 2009-07-14 [b1] => [b2] => [b3] => [b4] => [b5] => ) [1] => Array ( [id] => 1 [date] => 2009-07-15 [b1] => [b2] => [b3] => [b4] => [b5] => ) と言うような配列があります(実際にはキーは0から13まで固定) そこにもうひとつの配列 $bbb = Array ( [0] => Array ( [id] => 1 [date] => 2009-07-15 [b1] => true [b2] => false [b3] => true [b4] => false [b5] => true ) があります(キーは最大13個ですが、毎回不定数) このような場合で、$aaa配列の[date]と$bbb配列の[date]が同じ物が有った場合、$aaa配列の該当する部分の値を、$bbb配列の値で置き換えたいのですが、どのような方法があるでしょうか? お願いいたします。

    • 締切済み
    • PHP
  • 「動的確保した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){ //ここをどう書いたらいいかわからない }

専門家に質問してみよう