C-Malloc三维阵列
我正在尝试运行下面的代码,但我收到一个错误(在for循环期间)。当我试图将索引设置为c[nL][nL][nL][nL][nL][nL][nL][nL][nL][nL][nL thread]时,我的“3D数组”(对于i,j,k max)似乎被定义为c[nL][nL nL nL nL nL nL nL nL thread],因此出现了错误C-Malloc三维阵列,c,C,我正在尝试运行下面的代码,但我收到一个错误(在for循环期间)。当我试图将索引设置为c[nL][nL][nL][nL][nL][nL][nL][nL][nL][nL][nL thread]时,我的“3D数组”(对于i,j,k max)似乎被定义为c[nL][nL nL nL nL nL nL nL nL thread],因此出现了错误 #include<stdio.h> #include<stdlib.h> #include<string.h> #includ
#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();
}
#包括
#包括
#包括
#包括
#包括
双***alloc3(整数x,整数y,整数z){
int i,j;
double*p=(double*)malloc(x*y*z*sizeof(double));
double***数组=(double***)malloc(x*sizeof(double**));
对于(i=0;i您的分配函数有问题。偏移量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][j]
应指向array[i][j]
之后的y*z
元素。这就是大小似乎发生切换的原因(但也可能导致越界访问).注意:x*y*z
inx*y*z*sizeof(double)
可以溢出int
math.sizeof(double)*x*y*z
具有使用size\t
math的优点,当然比int
宽。如果您的x、y、z值很大,这一点很重要。“我(在for循环期间)收到一个错误”-->请描述错误指示并提供任何错误消息。int idx=x*j+x*y*i;
应为int idx=z*j+y*z*i;
?