В первом случае память выделяется в стеке последовательно - идентификатор массива представляет собой "указатель первого порядка" (int *), а доступ к элементу
одномерного массива осуществляется через сложение индексов (I = I1 + I2*N2 + I3*N3)
Во втором случае память выделяется в стеке отдельными блоками - идентификатор массива представляет собой "указатель третьего порядка" (int ***), а доступ к элементу массива осуществляется через последовательное обращение по адресам указателей (к I1-му элементу массива указателей второго порядка, оттуда к I2-му элементу массива указателей первого порядка, а уже оттуда к I3-му элементу )
Цитата nikit-xxx:
пишет ошибку: строка 23 | error: cannot convert 'int***' to 'int (*)[5][6]' for argument '1' to 'void test_function(int (*)[5][6])' »
|
Для использования статического массива (вариант 1) нужно объявить функцию
void test_function(int *array[5][6]) - это позволит программе правильно вычислять индекс для указателя array [i1][i2][i3] по известным "размерам" .
А вот если объявить функцию
void test_function (int array [4][5][6]), то произойдёт
копирование статического массива в функцию. Понятно, что передавать объекты большого размера крайне нежелательно (занимает "много" времени, да и стэк - не резиновый). Это делается, если в процессе работы функции переданный объект изменится, в то время как оригинальный массив меняться не должен.
Если же изменений не будет, то можно передать объект константной ссылкой
test_function (const int &array [4][5][6])
И самое главное, никогда не задавай границы массивов цифрами - только через константы
Код:
![Выделить весь код](images/misc/selectcode.png)
const int sizeA = 4;
const int sizeB = 5;
const int sizeC = 6;
.................
int Array [sizeA][sizeB][sizeC];
Если использовать обычные цифры, то при изменении размера в одном месте программы можно легко забыть изменить его в другом.
P.S.
Цитата PhilB:
t = (int*) malloc(5); - выделит лишь 5 байт, а вам надо t = (int*) malloc(5*sizeof(int)); - 5 элементов типа int (на 32бит архитектуре - 20 байт) »
|
Для выделения памяти под массивы можно также использовать функцию calloc с двумя параметрами (размер элемента, кол-во элементов) или оператор new []
Цитата PhilB:
malloc является системным вызовом, он запрашивает память в куче у ОС.
free также является системным вызовом, он освобождает участок памяти в куче.
ОС хранит информацию о выделенной памяти в своих внутренних структурах, к которым оно и обращается при вызове malloc , free, таким образом ОС знает сколько памяти надо освободить. »
|
Между прочим, операторы new (new[]) и delete (delete[]) используют несколько другие вызовы, чем функции malloc-realloc-free.