C Malloc 3D 数组

标签 c

我尝试运行下面的代码,但收到错误(在 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/

相关文章:

c - C中的for循环内值变成0

c - 编译时asm中不可能的约束

c - C程序中的参数类型区分

c - 在 int 和 double 之间进行运算

c - 读取直到行尾

c - 强制宏在 2 个标记之间放置一个空格

C - 追加字符串直到分配的内存结束

arrays - 在 C 中初始化了一个指针数组 - 可能无法初始化可变大小的对象

c - 编译时数组的静态内存分配

c - 如果函数循环,带有种子的 rand 不会返回随机数