首页 > 解决方案 > C Malloc 3D 数组

问题描述

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

预先感谢您的帮助。

标签: c

解决方案


您的分配功能有问题。偏移量计算idx错误:

int idx = x*j + x*y*i;

应该

int idx = z*j + y*z*i;

注意array[i][j+1]应该指向z之后的元素array[i][j],并且array[i+1][j]应该指向y*z之后的元素array[i][j]。这就是为什么大小似乎切换的原因(但也可能导致越界访问)。


推荐阅读