многомерный очень большой массив - PullRequest
0 голосов
/ 27 ноября 2018

Привет, я хочу использовать многомерный очень большой массив.Я попробовал следующий код.Он компилируется, но когда я его выполняю, он дает мне ошибку ошибки сегментации.

'int NT = 35; int NX = 25; int NY = 25; int NZ = 25;
double dt = 0.1; double dx = 0.5; double dy = 0.5; double dz = 0.5;

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));
double** B=(double**)malloc(NX*NY*NZ*NT*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.;
            }
        }
    }'

, но когда я работаю в нижней части, то я получаю ошибку сегментации, следующая часть моих кодов состоит из следующих строк, которые включают 2d-массивы.и этот 2d массив очень большой, возможно из-за этого я получаю ошибку сегментации

    'if(B==NULL){
    cout<<"Malloc space error!"<<endl;
    return 0;
    }
    cout<<"work"<<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<<"not working"<<endl;' 

, поэтому код между работой и не работает имеет проблему, которая вызывает ошибку сегментации.Любые решения для этого.

1 Ответ

0 голосов
/ 29 ноября 2018

int NT = 35; int NX = 25; int NY = 25; int NZ = 25;

Для простоты давайте изменим все это на NT=NX=NY=NZ=2.Эта строка:

double** B=(double**)malloc(NX*NY*NZ*NT*sizeof(double*));

будет выделять место для 16 указателей.На первой итерации циклов эта строка:

B[position][it]=0.;

будет эквивалентна:

double *tmp = B[0];  // Load uninitialized pointer from B[0]
tmp[0] = 0.0;        // Dereference uninitialized pointer to store something.

Не удивительно, что этот код приводит к SIGSEGV.

Что вы вероятно имели в виду:

double *B = malloc(NX*NY*NZ*NT*sizeof(double));
for(int ix = 0; ix < NX; ix++) {
  for(int iy = 0; iy < NY; iy++) {
    for(int iz = 0; iz < NZ; iz++) {
       for(int it = 0; it < NT; it++) {
         int position = NT * (NZ * (NY * ix + iy) + iz) + it;
         B[position] = 0.0;
       }
    }
  }
}
...