【发布时间】: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<double> foo(NX * NY * NZ);&std::vector<double> bar(NX * NY * NZ * LT * NT); -
C++ ?
malloc()? -
& 请不要将
'放在代码周围,缩进4 个空格即可。 -
它编译 -- 它不应该编译。
double PosT[NT];这不是有效的 C++,因为 C++ 要求数组大小由编译时表达式表示,而不是运行时值。如前所述,使用std::vector。
标签: c++ segmentation-fault malloc