- •Обзорные лекции по курсу
- •Int Temp[12] - {2, 4, 7, } ;
- •Int main ()
- •Разыменование указателей
- •Int main()
- •Void *ptr;
- •Int main ()
- •Int main ()
- •Int main ()
- •Void *malloc(size_t size);
- •Void *calloc( size_t num, size_t size );
- •Void free(void *block);
- •Int main(void)
- •Int* pRegion;
- •Void newHandler()
- •Int main()
- •Int main ()
- •Int strcmp(const char* strl, const char* str2)
- •Int stricmp(const char* strl, const char* str2)
- •Int strncmp(const char* strl,
- •Int strnicmp(const char* strl,
- •Void *malloc(size_t size);
- •Void *calloc( size_t num, size_t size );
- •Void free(void *block);
- •Int main(void)
- •Int* pRegion;
- •Int main ()
- •Упражнения для самопроверки
Int main ()
{
char ArrayOfChar[3][2] = {'W','O','R' , 'L' , 'D' ,'!'};
char* pArr = (char*)ArrayOfChar;
pArr += 3; char Letter = *pArr; cout « Letter;
return 0;
}
В приведенном примере объявляется массив символов размерностью 3 х 2 и указатель pArr на него (фактически - указатель на ArrayOf Char [ 0 ] [ 0]). В строке
char* pArr = (char*)ArrayOfChar;
идентификатор ArrayOf Char уже является указателем на элемент с индексом 0. однако, поскольку массив двумерный, требуется его повторное разыменование.
Увеличение pArr на 3 приводит к тому, что он указывает на элемент массива, значение которого - символ ' L' (элемент ArrayOf Char [ 1 ] [ 1 ]). Далее осуществляется вывод содержимого ячейки массива, на которую указывает pArr.
Динамическое выделение массивов
В программе каждая переменная может размещаться в одном из трех мест: в области данных программы, в стеке или в свободной памяти (так называемая куча).
Каждой переменной в программе память может отводиться либо статически, то есть в момент загрузки программы, либо динамически - в процессе выполнения программы.
До сих пор все определяемые массивы объявлялись статически, и, следовательно, хранили значения всех своих элементов в стековой памяти или области данных программы. Если количество элементов массива невелико, такое размещение оправдано. Однако довольно часто возникают случаи, когда в стековой памяти, содержащей локальные переменные и вспомогательную информацию (например, точки возврата из вложенных функций), недостаточно места для размещения всех элементов большого массива. Ситуация еще более усугубляется, если массивов большого размера должно быть много. Здесь на помощь приходит возможность использования для хранения данных динамической памяти, доступ к которой реализуется с помощью ряда специальных функций.
ФУНКЦИИ malloc, calloc, free и операторы new и delete
Чтобы в дальнейшем можно было разместить в памяти некоторый динамический объект, для него необходимо предварительно выделить в памяти соответствующее место. По окончании работы с объектом выделенную для его хранения память требуется освободить.
Выделение динамической памяти под объект осуществляется при помощи следующих выражений:
malloc;
calloc;
new;
Освобождение выделенных ресурсов памяти производится выражениями:
free;
delete;
Функция malloc подключается в одном из заголовочных файлов stdlib.h или alloc.h и имеет синтаксис:
Void *malloc(size_t size);
Данная функция призвана выделить в памяти блок размером size байт из кучи. В больших моделях памяти (Compact, Large, Huge) для кучи доступно все пространство памяти от вершины программного стека. В моделях Tiny, Small и Medium это пространство сокращено из-за наличия небольшой системной области, позволяющей стеку расти.
В случае успешного резервирования блока памяти функция malloc возвращает указатель на только что выделенный блок.
При неудачном результате операции с памятью функция возвращает NULL - зарезервированный идентификатор со значением '\0' (абсолютное значение 0x00). При этом содержимое блока остается неизменным. Если в качестве аргумента функции указано значение 0, функция возвращает NULL.
Как видно из синтаксиса, данная функция возвращает указатель типа void, однако, поскольку на практике чаще всего приходится выделять память для объектов конкретного типа, приходится приводить тип полученного пустого указателя к требуемому типу. Например, выделение памяти под три объекта типа int и определение указателя на начало выделенного блока можно произвести следующим образом:
int pint = (int*)malloc(3*sizeof(int));
В отличие от malloc, функция calloc кроме выделения области памяти под массив объектов еще производит инициализацию элементов массива нулевыми значениями. Функция имеет следующий синтаксис: