• ベストアンサー

多次元配列のメモリ確保について

mallocを使ってA[500][40][40]のような多次元配列を動的に確保したいのですがどのように宣言すればよいでしょうか? 初歩的な質問で申し訳ありませんがおねがいします。

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

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

> 多次元配列を動的に確保したい 厳密には、いわゆる多次元配列を動的に確保することはできないと思います。 メモリのかたまりを動的に確保して、それをあたかも 配列であるかのごとく扱えるにすぎないのだと思います。 下記の例は、たぶんうまく動くと思います。 #include <stdio.h> #include <stdlib.h> #define X (2) #define Y (3) #define Z (4) int main(void) { int ***p, i, j, k; p = malloc(sizeof(int **) * X); if (!p) fprintf(stderr, "error\n"), exit(1); for (i = 0; i < X; i++) { p[i] = malloc(sizeof(int *) * Y); if (!p[i]) fprintf(stderr, "error\n"), exit(1); for (j = 0; j < Y; j++) { p[i][j] = malloc(sizeof(int) * Z); if (!p[i][j]) fprintf(stderr, "error\n"), exit(1); for (k = 0; k < Z; k++) { p[i][j][k] = i * 100 + j * 10 + k; printf("p[%d][%d][%d]=%d\n", i, j, k, p[i][j][k]); } } } return 0; }

その他の回答 (5)

回答No.6

過信しないでください。参考程度に。 /*データ*/ struct Handle3DArray { int xMax; int yMax; int zMax; int* pMemory; }; /*一次元に変換*/ int CalcIndex(const Handle3DArray* p, int x, int y, int z) { const int lay = p->xMax * p->yMax * z; const int vol = x + p->xMax * y; return lay + vol; } /*体積*/ int CalcSize(const Handle3DArray* p) { return (p->xMax * p->yMax * p->zMax); } /*確保*/ void Alloc(Handle3DArray* p) { p->pMemory = (int*)malloc(sizeof(int) * CalcSize(p)); } /*開放*/ void Dealloc(Handle3DArray* p) { free(p->pMemory); memset(p, 0, sizeof(Handle3DArray)); } /*値を入れる*/ void Set(Handle3DArray* p, int x, int y, int z, int iValue) { p->pMemory[CalcIndex(p, x, y, z)] = iValue; } /*値をとる*/ int Get(const Handle3DArray* p, int x, int y, int z) { return p->pMemory[CalcIndex(p, x, y, z)]; } /*お試し*/ void main() { // x, y, z Handle3DArray a = {500, 40, 40, NULL}; Alloc(&a); int iTest = 0; for(int x = 0; x < a.xMax; ++x) for(int y = 0; y < a.yMax; ++y) for(int z = 0; z < a.zMax; ++z) { Set(&a, x, y, z, iTest++); const int res = Get(&a, x, y, z); printf("%d\n", res); } Dealloc(&a); }

stickright
質問者

お礼

参考になるソースを送っていただきありがとうございます。 プログラミングスキルがまだまだ足りなくてアロー演算子などが 苦手ですが、これからの参考になりそうなので読ませていただきます。

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

> 処理系によってできたりできなかったりします。 > 例:gccではできる、Borland C++ではできない Borland C++ Compilerは古い規格に従っているからです。 処理系が書かれていないので、Cの現行規格で使える方法を紹介しました。

stickright
質問者

お礼

ありがとうございます。 私の使っているのはVC++ 6.0なのですが、できなかったようです。

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

>#3さん 処理系によってできたりできなかったりします。 例:gccではできる、Borland C++ではできない

stickright
質問者

お礼

細かく説明していただきありがとうございます。 先程の方法で試してみようと思います。

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

こんな感じでしょうか? int (*A)[40][40] = malloc(sizeof(int[500][40][40])); 各要素数は可変にすることも可能です。 int a = 500; int b = 40; int c = 40; int (*A)[b][c] = malloc(sizeof(int[a][b][c]));

  • fifaile
  • ベストアンサー率25% (622/2403)
回答No.1

検索で最初に出てきたページですが、どうでしょう? http://sometime.minidns.net/~ccgi/pointer_array.html

stickright
質問者

お礼

ありがとうございます。 擬似的な多次元配列についてとても詳しく説明されており、メモリ確保できるようになりました。