【问题标题】:multidimensional very large array多维超大数组
【发布时间】:2019-04-29 00:40:04
【问题描述】:

您好,我想使用多维非常大的数组。我尝试了以下代码。它可以编译,但是当我执行它时,它会给我分段错误错误。

'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 数组的行。这个二维数组非常大, 也许正因为如此,我得到了分段错误

    '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;' 

所以工作和不工作之间的代码存在导致分段错误的问题。任何解决方案。

【问题讨论】:

    标签: arraylist multidimensional-array segmentation-fault malloc dynamic-arrays


    【解决方案1】:

    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;
           }
        }
      }
    }
    

    【讨论】:

    • 但是我在 b_x[position] 、 b_y[position] 和 B[position][it] 的位置不一样。我希望 b_x、b_y 和 B 中的位置相同,但 B 会随着时间进一步衰减,所以 [position][it]
    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 2019-02-10
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多