Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-Malloc三维阵列_C - Fatal编程技术网

C-Malloc三维阵列

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

我正在尝试运行下面的代码,但我收到一个错误(在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>
#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
in
x*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;