Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ekzamenYazyki_programmirovania.docx
Скачиваний:
21
Добавлен:
25.09.2019
Размер:
794 Кб
Скачать
☆

Va_start (ptr, последний_явный_параметр);

Дальше с помощью указателя ptr можно получить значение первого фактического параметра из списка переменной длины. Остаётся неизвестным тип этого параметра.

Этот тип необходимо каким-либо образом передать в функцию, используя явные параметры.

Определив тип очередного параметра, обращаемся к макросу va_arg(ptr, type), который вернёт значение искомого параметра.

24 Массивы и динамическая память. Функции malloc, calloc, realloc, free- прототипы и краткий анализ.

Массивы и динамическая память

Формирование массив с переменными размерами можно организовать с помощью указателей и средств для динамического выделения памяти.

Начнём рассмотрение указанных средств с библиотечных функций, которые описаны в файле stdlib.h

Функции, использующиеся для работы с динамической памятью

malloc()

calloc()

realloc()

malloc()- функция выделения динамической памяти, входящая в стандартную библиотеку языка Си.

Прототип:

void *malloc (size_t size);

size — размер распределяемой области памяти

принимает в качестве аргумента размер выделяемой области в байтах; возвращает нетипизированный указатель (void*) на область памяти заявленного размера или NULL в случае, если выделить память невозможно. Содержимое выделяемой области памяти не определено.

calloc() работает как и malloc(), но она так же предназначена для очищения памяти.

Прототип:

void *calloc (size_t num, size_t size);

num — количество распределяемых элементов

size — размер каждого элемента

calloc принимает в качестве аргумента количество элементов и размер каждого элемента в байтах; возвращает нетипизированный указатель (void*) на область памяти заявленного размера или NULL в случае, если выделить память невозможно. Значения элементов устанавливаются в ноль. malloc работает быстрее, чем calloc, в связи с отсутствием функции обнуления выделяемой памяти.

realloc() изменяет размер блока памяти, ранее созданного функцией malloc или calloc

Прототип:

void *realloc (void* ptr, size_t size);

ptr — указатель на исходный блок памяти

size — новый размер в байтах.

При вызове realloc возможен один из следующих исходов:

1) Если для расширения блока, находящегося по адресу ptr, имеется достаточно памяти, то происходит её выделение в нужном количистве и функция возвращает ptr.

2) Если памяти недостаточно для расширения по текущему адресу, создаётся новый блок размера size и имеющиеся данные копируются из старого блока в начало нового. Старый блок освобождается. Ф-я возвращает указатель на новый блок памяти.

3) Если ptr==null, то функция действует так же, как и malloc

4) Если аргумент size == 0, тогда блок памяти ptr освобождается, а функция возвращает NULL.

5) Если для перераспределения памяти недостаточно места: нельзя расширить старый блок или создать новый — функция возвращает NULL, а исходный блок остаётся неизменным.

Функция free() решает вопрос освобождения памяти, которая перед этим была выделена одной из трёх вышеприведённых функций. Сведения об этом участке памяти передаются в функцию free с помощью указателя – параметра типа void*.

Пример создания динамического массива

int i,n,m,**A; // ** - двумерный массив

scanf(“%d %d”,&n,&m);

A = int(**)malloc(n*sizeof(int*));

for(i=0;i<n;i++)

{

A[i] = (int*)malloc(m*sizeof(int));

}

va_end(ptr) предназначена для организации возврата из функции с переменным количеством параметров. Она должна быть вызвана после того, как будет обработан весь список параметров. Функция удаляет указатель для того, чтобы нельзя было использовать его повторно без вызова va_start().