c - 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();
}
预先感谢您的帮助。
解决方案
您的分配功能有问题。偏移量计算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]
。这就是为什么大小似乎切换的原因(但也可能导致越界访问)。
推荐阅读
- javascript - 如何在二维数组中设置值?
- python - 如何在 matplotlib 中添加垂直微分线(或残差)?
- swift - 在函数的参数中使用“in”
- python - 如何停止包含两个继承的 for 循环的 while 循环
- django - 如何在 Django 中提交类别表单?
- python-3.x - 尝试在 Python 中的 GTK 中使用 OpenGL 时出现“无效操作”错误
- raku - Raku 相当于 Java StringBuffer/StringBuilder?
- websocket - AppSync 使用 Websocket 订阅外部数据提供者
- ag-grid - 有没有办法在 ag 网格中的 2 个单元格渲染器之间传递数据?
- javascript - 选中时更改复选框的颜色