Это нормально, когда input является указателем на трехмерный вектор:
/* original */
input[i] = malloc(sizeof(int *)*bands);
Когда input становится целым ****
: указатель на указатель на вектор, это изменение неверно:
/* 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 **)
и т. Д. Он основывался на типеВыражение указателя присваивается.