回答受付が終了しました

c++での巨大配列について、

回答(3件)

0

C++ であれば、new を使えばいいように思います。 malloc でもできますが、キャストする必要がありますので、new でするのがいいですね。さらに auto でポインタを宣言すれば、ソースがシンプルに書けます。 こんな感じでどうですか? #include <iostream> #include <iomanip> #define N 100 int main(void) {     auto F = new double[N][N][N];     //配列に値をセット     for (int i = 0; i < N; ++i) {         for (int j = 0; j < N; ++j) {             for (int k = 0; k < N; ++k) {                 F[i][j][k] = (((i + 1) * N) + (j + 1)) * N + k + 1;             }         }     }     //ポインタの2次元配列を動的に確保     auto p = new double *[N][N];     for (int i = 0; i < N; ++i) {         for (int j = 0; j < N; ++j) {             p[i][j] = F[i][j];         }     }     //それぞれのポインタで配列をアクセス     std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(0);     for (int i = 0; i < N; ++i) {         std::cout << "F[" << std::setw(2) << i << "]["                           << std::setw(2) << i << "]["                           << std::setw(2) << i << "] = "                           << std::setw(7) << F[i][i][i] << "("                           << std::setw(7) << p[i][i][i] << ")\n";     }     delete[] p;     delete[] F; }

newは一次元でしか使用できないと思っていましたが, 完全なる思い込みでした. ご提案いただいたプログラムも細部まで教えていただきありがとうございます.

1

10000*10000*10000ってことは、1,000,000,000,000=1テラ*doubleサイズなので、どう足掻いても確保は無理な気がしますが。

1人がナイス!しています

0

ローカル変数の配列はスタックメモリ上に確保されますが、 スタックメモリエリアのサイズは小さいので、巨大な配列は置けません。 大きなメモリ空間を確保するには、malloc等で確保すれば、ヒープ領域に確保されるため、大きな物も可能になります。