我正在使用尺寸为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错误。
任何建议都会非常有用,谢谢。
答案 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 **)
等,而是基于指定给它的指针表达式的类型。