我尝试运行下面的代码,但收到错误(在 for 循环期间)。似乎我的“3D 数组”被定义(对于 i、j、k max)为 c[nL_thread][nL][nL],而我尝试将索引设置为 c [nL][nL][nL_thread],因此出现错误。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<omp.h>
#include<mpi.h>
double ***alloc3(int x, int y, int z){
int i, j;
double *p = (double *) malloc(x*y*z*sizeof(double));
double ***array = (double ***) malloc(x*sizeof(double **));
for (i=0; i<x; i++){
array[i] = (double **) malloc(y*sizeof(double *));
for (j=0; j<y; j++){
int idx = x*j + x*y*i;
array[i][j] = &p[idx];}}
return array;
}
int main(int argc, char *argv[]){
MPI_Init(&argc, &argv);
int i, j, k;
int nL;
int nL_thread;
double ***c;
int nbr, rank;
MPI_Comm_size(MPI_COMM_WORLD, &nbr);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
nL = 10;
nL_thread = 4;
c = alloc3(nL+1, nL+1, nL_thread+1);
for(k=0; k<=nL_thread; k++){
for(j=0; j<=nL; j++){
for(i=0; i<=nL; i++){
c[i][j][k] = 0;}}}
MPI_Finalize();
}
预先感谢您的帮助。
最佳答案
您的分配函数有问题。偏移量idx
的计算错误:
int idx = x*j + x*y*i;
应该是
int idx = z*j + y*z*i;
请注意,array[i][j+1]
应指向 array[i][j]
之后的 z
个元素,并且array[i+1][j]
应指向 array[i][j]
之后的 y*z
元素。这就是为什么大小看起来被切换的原因(但也可能导致越界访问)。
关于C Malloc 3D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53357181/