3d массив, передаваемый по ссылке в C - PullRequest
1 голос
/ 08 марта 2012

Я работаю с очень большими кубами изображений размером 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...) `цикл. Любые предложения будут очень полезны, спасибо.

1 Ответ

5 голосов
/ 08 марта 2012

Это нормально, когда 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 **) и т. Д. Он основывался на типеВыражение указателя присваивается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...