2013-11-27 1 views
2

Я пытаюсь выделить 3D-массив в C. Как вы можете сказать, он должен хранить данные изображения в форме Array [height] [width] [channel]; Это код, который у меня есть.Выделение 3D-массива в C с помощью malloc()

BYTE*** allocateImageArray(INT_32 width, INT_32 height, INT_32 channels) { 
    BYTE*** array; 
    INT_32 i, j; 

    array = malloc(height * sizeof(BYTE**)); 

    for(i = 0; i < height; i++) { 
     array[i] = malloc(width * sizeof(BYTE*)); 

     for(j = 0; j < channels; j++) { 
      array[i][j] = malloc(channels * sizeof(BYTE)); 
     } 
    } 

    printf("Pixel Array Size: %d\n", sizeof(array)); 
    return array; 
} 

Он компилируется в порядке. Однако массив всегда равен 8 в конце (обозначается sizeof). И когда я пытаюсь получить доступ к массиву позже в коде, программа просто сработает.

Все ответы благодарны в продвинутом режиме.

EDIT: Забыл включить. Я разработал, где происходит сбой программы. Это происходит, когда я пытаюсь присвоить значение одному из BYTES в конце массива.

+0

Почему не 'массив = таНос (высота * ширина * канал * SizeOf (BYTE))'? –

+0

Это был мой оригинальный код, но у него тоже была такая же проблема. Кроме того, он не определяет, сколько строк, столбцов и (что бы ни называли 3-е измерение)? – user3039913

+0

Это зависит от того, как вы получаете доступ к элементам. 'array [0] [0] [0]' например. –

ответ

2

Оператор sizeof не сообщает вам размер динамически распределенных массивов.

sizeof возвращает размер в байтах базового типа данных, который в вашем случае является указателем на указатель на указатель на BYTE.

Поскольку array по-прежнему является указателем (независимо от того, на что он указывает), возвращаемый размер 8 байтов имеет смысл.

Пожалуйста, обратитесь к объяснению sizeof operator.

Помимо:

Я также рекомендовал бы иметь взгляд на Why does sizeof(x++) not increment x? интересную ошибку, которая может подпирать вверх с sizeof оператора и предположения, что новые программисты делают об этом.

2

Оператор sizeof не работает. Подумайте, если это больше как специальный макрос #define, который определяет размер чего-то, основанного на его типа.

So sizeof(array) - это то же самое, что и sizeof(BYTE***), что и у sizeof(void*), что, по-видимому, 8 для вашего компьютера.

+0

Спасибо за оба ответа. Имеет смысл. Любые идеи о том, почему он рушится? Является ли код неправильным для его распределения или другой возможной проблемой?Я работал с сбоем, когда пытаюсь присвоить значение одной из записей массива. – user3039913

1

sizeof(array) == Число байтов для указателя, которое составляет 8 байтов в вашем случае.

2

BYTE ** это просто указатель, так что в конце концов SizeOf (BYTE **) всегда возвращает 8.

Вы можете попробовать следующий код:

#define value_at_index(a,i,j,k,m,n) (a)[(i)*m*n + (j)*n + (k)] 

static BYTE*** allocateImageArray(int width, int height, int channels) { 
    BYTE (*array)[width][height]; 

    array = malloc(width * height * channels * sizeof(BYTE)); 
    array[1][2][3] = 1; 

    printf("array[1][2][3] = %d", array[1][2][3]); 

    return (BYTE***)array; 
} 

Поступая таким образом, у вас есть непрерывное пространство памяти для 3-размерности массива, то в главном() вы можете назвать так:

BYTE ***array = allocateImageArray(10, 20, 30); 
printf("array[1][2][3] = %d", value_at_index(array, 1, 2, 3, 10, 20)); 
+0

Я отредактировал свой ответ. Я попробовал свой старый код и понял, что возврат указателя не будет работать, поскольку он не знает, как интерпретировать результат '' BYTE *** array = allocateImageArray (10, 20, 30); '' So I для этой цели был добавлен макрос #define. – Krypton

Смежные вопросы