在C中通过引用传递的3d数组

时间:2012-03-07 23:02:12

标签: c arrays reference 3d

我正在使用尺寸为x * y * z的一些非常大的图像多维数据集。

目前我一直在处理它们

int ***input = malloc(sizeof(int **)*(lines));
int d;
int i;
for(i = 0 ; i<lines ; i++) {
    input[i] = malloc(sizeof(int *)*bands);

    for(d = 0 ; d<bands ; d++) {
        *input[i][d] = malloc(sizeof(int)*(samples));
    }
}

这对我来说很好,但现在我正在重写一些代码,并希望能够通过引用传递数组

我想这样做需要我传递foo(&input)

函数如下所示:

foo(int ****input) {
    *input = malloc(sizeof(int **)*(lines));
    int d;
    int i;
    for(i = 0 ; i<lines ; i++) {
        *input[i] = malloc(sizeof(int *)*bands);

        for(d = 0 ; d<bands ; d++) {
            *input[i][d] = malloc(sizeof(int)*(samples));
        }

    }
}

但是,我似乎在进入第一个for(i...)循环后收到了seg错误。 任何建议都会非常有用,谢谢。

1 个答案:

答案 0 :(得分:5)

当输入是指向3D矢量的指针时,这很好:

/* original */
input[i] = malloc(sizeof(int *)*bands);

当输入变为int ****:指向向量指针的指针时,此更改不正确:

/* original */
*input[i] = malloc(sizeof(int *)*bands);

你想:

/* original */
(*input)[i] = malloc(sizeof(int *)*bands);

在C中,*x[y]表示*(x[y])

更简单的方法是使用局部变量:

void function(int ****pinput)
{
  int ***input = malloc(/* ... */);
  /*...code stays the same as before...*/
  *pinput = input; /* place it in the location specified by caller */
}

另外,让我们对原作进行一些风格调整。 (忽略缺少malloc故障检查):

int ***input = malloc(lines * sizeof *input);

int d;
int i;

for(i = 0 ; i<lines ; i++) {
    input[i] = malloc(bands * sizeof *input[0]);

    /* Noticed an error here: you have *input[i][d] = ... 
       but input[i][d] the pointer to the band;
       *input[i][d] is input[i][d][0]! */
    for(d = 0 ; d<bands ; d++)
        input[i][d] = malloc(samples * sizeof *input[0][0]);
}

我刚刚取出了一些不必要的括号,并改变了计算的大小,以便不是重复(int **)等,而是基于指定给它的指针表达式的类型。