首页 > 解决方案 > 在 c 中创建动态 3d 矩阵

问题描述

我必须创建一个二维矩阵,并且在每个单元格中我必须放置一个数组,其长度在函数中计算,当我尝试以下代码时,它会因错误而崩溃Segmentation fault (core dumped)。在我看来,矩阵有 N_Sweep 行、N 列,最后一个维度是在函数中计算的。

double ***gamma;
gamma = malloc(N_Sweep*sizeof(double**));
for(i=0;i<N_Sweep;i++){
    gamma[i] = malloc(N_Sweep*N*sizeof(double*));
}
// ...
for(t=0;t<N;t++){
    for(i = 0; i<N_Sweep; i++){
        for(t_M = 1; t_M<(N_Sweep - i); t_M++){
            gamma[i][t] = malloc(sizeof(double) * (N_Sweep-i));
            gamma[i][t][t_M] = 3.0;
        }
    }
}

该函数的原型是: void gamma_computation(double ***gamma);

标签: cmatrixheap-memory

解决方案


首先,您应该在第一个循环中仅分配N * sizeof(double *)字节,因为您不希望 N 列N * N_Sweep,而且在第三个嵌套循环内,您应该多次分配矩阵的第三维(内存泄漏),而您之前应该只分配一次进入循环。

所以代码应该是:

double ***gamma;
gamma = malloc(N_Sweep*sizeof(double**));
for(i=0;i<N_Sweep;i++){
    gamma[i] = malloc(N*sizeof(double*));
}
// ...
for(t=0;t<N;t++){
    for(i = 0; i<N_Sweep; i++){
        gamma[i][t] = malloc(sizeof(double) * (N_Sweep-i));
        for(t_M = 1; t_M<(N_Sweep - i); t_M++){
            gamma[i][t][t_M] = 3.0;
        }
    }
}

推荐阅读