- ベストアンサー
多次元配列のメモリ確保について
mallocを使ってA[500][40][40]のような多次元配列を動的に確保したいのですがどのように宣言すればよいでしょうか? 初歩的な質問で申し訳ありませんがおねがいします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> 多次元配列を動的に確保したい 厳密には、いわゆる多次元配列を動的に確保することはできないと思います。 メモリのかたまりを動的に確保して、それをあたかも 配列であるかのごとく扱えるにすぎないのだと思います。 下記の例は、たぶんうまく動くと思います。 #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)
- machongola
- ベストアンサー率60% (434/720)
過信しないでください。参考程度に。 /*データ*/ 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); }
- jacta
- ベストアンサー率26% (845/3158)
> 処理系によってできたりできなかったりします。 > 例:gccではできる、Borland C++ではできない Borland C++ Compilerは古い規格に従っているからです。 処理系が書かれていないので、Cの現行規格で使える方法を紹介しました。
お礼
ありがとうございます。 私の使っているのはVC++ 6.0なのですが、できなかったようです。
- asuncion
- ベストアンサー率33% (2127/6289)
>#3さん 処理系によってできたりできなかったりします。 例:gccではできる、Borland C++ではできない
お礼
細かく説明していただきありがとうございます。 先程の方法で試してみようと思います。
- jacta
- ベストアンサー率26% (845/3158)
こんな感じでしょうか? 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)
検索で最初に出てきたページですが、どうでしょう? http://sometime.minidns.net/~ccgi/pointer_array.html
お礼
ありがとうございます。 擬似的な多次元配列についてとても詳しく説明されており、メモリ確保できるようになりました。
お礼
参考になるソースを送っていただきありがとうございます。 プログラミングスキルがまだまだ足りなくてアロー演算子などが 苦手ですが、これからの参考になりそうなので読ませていただきます。