Вопрос по динамическим массивам
Объясните пожалуйста разницу между
Код:
int b[4][5][6]; Код:
int i, j; |
разница в способе выделения памяти.
в первой цитате под переменную b будет выделено последовательно 4*5*6 полей int. последовательных. обязательно ровно 4*5*6 чтобы не случилось. во второй цитате память выделяется динамически. сначала выделяется ячейка памяти размером 4*int** и ее адрес записывается в b(тройной указатель). Затем в цикле в кусок размером int** (двойной указатель) хранящемуся по адресу b[i] (то что было выделено ранее) записывается адрес вновь выделяемого куска памяти размером 5*int*. В каждый кусочек по адресу b[i][j] мы записываем адрес вновь выделяемой ячейки памяти размером 6*int. И того получаем у нас 4 двойных указателя, каждый из которых хранит адрес 5-и указателей, которые указывают на 6*int памяти. что координально отличает первое от второго. В первом случае переменная у нас - это именно числа. а во втором - это адреса в памяти, по которым временно находятся некие зарезервированные места, от которых мы можем отказаться для экономии памяти или их перераспределить хитрым образом. на счет ошибки В теле мейна ты своей функции подсовываешь тройной указатель. А в объявлении функции ты говоришь о какомто непойми e[][5][6] который явно не тройной указатель. учи английский )) |
сообщение компилятора на английском мне было понятно, я просто думал что объявление массива в первой цитате и массива во второй цитате - одно и тоже. Да терь понимаю, что во второй цитате указатель на указатель на указатель на тип int.
Спасибо. |
Кстати, а в Кернигане говорится что
Цитата:
Ещё вопрос по функциям malloc / free: Код:
int *t; Теперь t указывает на самую первую ячейку памяти, отведённую для типа int ? Тогда откуда free(t) узнает сколько ячеек следует освободить? |
malloc является системным вызовом, он запрашивает память в куче у ОС.
free также является системным вызовом, он освобождает участок памяти в куче. ОС хранит информацию о выделенной памяти в своих внутренних структурах, к которым оно и обращается при вызове malloc , free, таким образом ОС знает сколько памяти надо освободить. t = (int*) malloc(5); - выделит лишь 5 байт, а вам надо t = (int*) malloc(5*sizeof(int)); - 5 элементов типа int (на 32бит архитектуре - 20 байт) Цитата:
|
В первом случае память выделяется в стеке последовательно - идентификатор массива представляет собой "указатель первого порядка" (int *), а доступ к элементу одномерного массива осуществляется через сложение индексов (I = I1 + I2*N2 + I3*N3)
Во втором случае память выделяется в стеке отдельными блоками - идентификатор массива представляет собой "указатель третьего порядка" (int ***), а доступ к элементу массива осуществляется через последовательное обращение по адресам указателей (к I1-му элементу массива указателей второго порядка, оттуда к I2-му элементу массива указателей первого порядка, а уже оттуда к I3-му элементу ) Цитата:
А вот если объявить функцию void test_function (int array [4][5][6]), то произойдёт копирование статического массива в функцию. Понятно, что передавать объекты большого размера крайне нежелательно (занимает "много" времени, да и стэк - не резиновый). Это делается, если в процессе работы функции переданный объект изменится, в то время как оригинальный массив меняться не должен. Если же изменений не будет, то можно передать объект константной ссылкой test_function (const int &array [4][5][6]) И самое главное, никогда не задавай границы массивов цифрами - только через константы Код:
const int sizeA = 4; P.S. Цитата:
Цитата:
|
Время: 05:16. |
Время: 05:16.
© OSzone.net 2001-