【问题标题】:multidimensional very large arrays c++多维非常大的数组 C++
【发布时间】:2018-11-28 05:14:17
【问题描述】:

我已经为多维非常大的数组编写了代码。它编译但是当我执行它时,它给了我分段错误。我的代码是:

int NT = 35; int NX = 25; int NY = 25; int NZ = 25;
double dx = 0.5; double dy = 0.5; double dz = 0.5; double dt = 0.1;
double PosT[NT];
double PosX[NX];
double PosY[NY];
double PosZ[NZ];
for (int i = 0; i < NT; i++)
    PosT[i] = i * dt + dt;
for (int i = 0; i < NX; i++)
    PosX[i] = dx * i;
for (int i = 0; i < NY; i++)
    PosY[i] = dy * i;
for (int i = 0; i < NZ; i++)
    PosZ[i] = dz * i;
double* b_x = (double*)malloc(NX*NY*NZ * sizeof(double));
double* b_y = (double*)malloc(NX*NY*NZ * sizeof(double));
if (b_x == NULL || b_y == NULL) {
    cout << "Malloc space error!" << endl;
    return 0;
}
for (int ix = 0; ix < NX; ix++) {
    for (int iy = 0; iy < NY; iy++) {
        for (int iz = 0; iz < NZ; iz++) {
            int position = ix * NY*NZ + iy * NZ + iz;
            b_x[position] = 0.;
            b_y[position] = 0.;
        }
    }
}

我的代码工作到这里,但是当我使用 malloc 跟踪非常大的二维数组时,我得到了错误。任何进一步的代码都遵循以下几行:

double** B=(double**)malloc(NX*NY*NZ*LT*sizeof(double*));
if (B == NULL) {
    cout << "Malloc space error!" << endl;
    return 0;
}
cout << "following not works" << endl;
for (int ix = 0; ix < NX; ix++) {
    for (int iy = 0; iy < NY; iy++) {
        for (int iz = 0; iz < NZ; iz++) {
            int position = ix * NY*NZ + iy * NZ + iz;
            for (int it = 0; it < NT; it++) {
                B[position][it] = 0.;
                cout << B[position][it] << endl;
            }
        }
    }
}

我尝试过 malloc,但它不起作用。任何解决方案或建议。使用非常大的此类数组的替代方法是什么? 因为我收到分段错误核心转储错误。

【问题讨论】:

  • B[position] 是一个未初始化的double* 指针,指向内存中的某个随机地址。 B[position][it] 尝试访问该内存,因此您的程序表现出未定义的行为。
  • 治愈:std::vector&lt;double&gt; foo(NX * NY * NZ); & std::vector&lt;double&gt; bar(NX * NY * NZ * LT * NT);
  • C++ ? malloc() ?
  • & 请不要将' 放在代码周围,缩进4 个空格即可。
  • 它编译 -- 它不应该编译。 double PosT[NT]; 这不是有效的 C++,因为 C++ 要求数组大小由编译时表达式表示,而不是运行时值。如前所述,使用std::vector

标签: c++ segmentation-fault malloc


【解决方案1】:

我不太愿意回答这个问题,但以下内容看起来不正确: double** B=(double**)malloc(NX*NY*NZ*LT*sizeof(double*)); 应该是: double** B=malloc(NX*NY*NZ*NT*sizeof(double));

看起来您只分配了所需大小的一半。

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 2011-04-11
    • 2014-08-20
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2013-03-26
    • 2015-08-18
    相关资源
    最近更新 更多