4. Дополнительные фунции ДРП

  Определение размера свободной области кучи

unsigned long coreleft(void);

Возвращает размер неиспользованной памяти в байтах, расположенной за последним занятым блоком. "Дырки" в куче не учитываются.

Блочное выделение памяти

void *calloc(size_t NItems, size_t SizeOfItem);

Выделяет и обнуляет память для Nitems фрагментов по SizeOfItem байт каждый. Размер фрагмента не превосходит 64K, но общий объем памяти может превышать 64K. В случае неудачи возвращается NULL.

Проверка целостности кучи

int heapcheck(void);

Просматривает кучу и проверяет для каждого блока указатели, размер и другую критическую информацию. Если все нормально, то возвращаемое значение больше 0. В противном случае, возвращается отрицательное число.

Просмотр блоков кучи

int heapwalk(struct heapinfo *hi);

Просматривает кучу блок за блоком. Предполагается, что сбоев в куче нет, для этого используйте heapcheck. Фнукция получает указатель на структуру heapinfo. При первом вызове, установите hi.ptr в 0. Функция устанавливает этот указатель на адрес очередного блока. Другие поля структуры size, in_use позволяют определить размер блока в байтах и его занятость. Для очередного блока функция вернет _HEAPOK, для последнего блока _HEAPEND.

Пример 3. Занятые и свободные блоки.

#include <stdio.h>

#include <alloc.h>

#define NUM_PTRS 4

#define NUM_BYTES 20

int main(void)

{

struct heapinfo hi;

char *array[ NUM_PTRS ];

for(int i = 0; i < NUM_PTRS; i++)

array[ i ] = (char *)malloc(NUM_BYTES);

for(i = 0; i < NUM_PTRS; i += 2)

free(array[ i ]);

hi.ptr = NULL;

printf(" Размер Статус\n");

printf(" ---- ------\n");

while(heapwalk(&hi) == _HEAPOK)

{

printf("%7u ", hi.size);

printf("%s\n",(hi.in_use?"используется": "свободен"));

}

return 0;

}

В результате будет напечатано

Размер Статус
528 Используется
32 Свободен
32 Используется
32 Свободен
32 Используется
Инициализация свободных блоков кучи

int heapfillfree(unsigned int fillvalue);

Заполняет байты свободных блоков кучи константным значением fillvalue.

Проверка свободных блоков кучи

int heapcheckfree(unsigned int fillvalue);

Проверяет байты свободных блоков кучи на их равенство константному значению fillvalue.

Функции группы far.

В моделях памяти, где куча не превышает 64K, можно использовать память вне этой области - дальнюю кучу. Для работы с дальней кучей имеются свои версии функций, c префиксом far.

 

5. Лабораторные задания

Области памяти

Для следующей программы укажите значения сегментных регистров. Укажите абсолютные адреса и размеры в байтах области кода; области данных, глобальных и статических переменных; стека; кучи. Модель памяти large. Определите в отладчике адреса и размещение по областям переменных: main; Privet; Dlit в функции main; i и Dlit в функции Privet; printf.

void Privet(int sound); // прототип функции Privet

main(){

int Dlit = 5;

Privet(Dlit); //вызов функции Privet

}

void Privet(int Dlit) { // заголовок функции Privet

{

printf("Привет!\n");

printf("С добрым утром!");

for(int i = 0; i<Dlit; i++) //печатает первые Dlit

printf("%c", i); // символов ascii-таблицы

}

Исследование менеджера ДРП

Выделите динамическую память для трех данных типа char. Адреса сохраните в переменных char *x, *y, *z. Определите в отладчике адреса *x, *y, *z. Убедитесь, что для кажго из однобайтовых данных будет отведено в куче 16 байт,т.е. целый параграф.

Односвязный список менеджера

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

Новый менеджер

Язык Си не пускает дефрагментации ДП. Напишите свой менеджер, содержащий функции mymalloc, myfree, mydefrag.

Сумма свободных блоков

Определите суммарный объем "дырок" в куче, образовавшихся после освобождения блоков.

Выделение памяти под одномерный массив

Выделите память под 20 переменных типа int. Заполните их случайными целыми числами из интервала от -3 7. Выведите их на экран.

Выделение памяти под двумерный массив

Выделите память под двумерный массив 3х5 типа float. Заполните их случайными вещественными числами из интервала от -3.6 7.4 с шагом 0.1. Выведите их на экран в виде таблицы. Массив представьте в виде строки.

Структура для матрицы переменных размерностей.

Создайте структуру для хранения информации о матрице переменных размерностей. Рассмотрите две возможности

Struct Matr1{ int m, n; int *ptr;};

Struct Matr2{ int m, n; int **ptr;};

Напишите функции

int DinMatr1(Matr1 *matr);

int DinMatr2(Matr2 *matr);

для корректного выделения памяти под массив

Умножение матриц

Напишите функцию умножения матриц переменных размерностей.

Ввод чисел

С клавиатуры вводятся натуральные числа. Признак конца ввода - число 0. Сохраняйте числа в куче. По окончании ввода выдайте числа на экран.

Список строк

Создайте односвязный список для хранения текстовых строк, вводимых с клавиатуры. Выведите их на экран в обратном порядке.

Норма матрицы

Октаэдрической нормой квадратной матрицы А, nxn, называется число ÷÷A÷÷ = max{÷a1j÷+÷a2j÷+ …+÷anj÷: j=1,…n}. Напишите функцию для вычисления нормы матрицы. Размеры матрицы произвольный.

Наибольшая по размеру квадратная матрица.

Найдите наибольший размер N, для которого в куче можно выделить в памяти место для квадратной матрицы NxN чисел типа float. Получите результат при запуске программы из командной строки DOS и из оболочки BC.

Модификация функции coreleft.

Напишите функцию вычисления общего размера свободной кучи.

Свободна ли куча?

Напишите функцию определяющую, свободна ли куча.

Работа с файлом.

Запишите динамическую матрицу в файл, прочитайте из файла и распечатайте.

 
Библиографический список

1.    Керниган Б, Ритчи Д. Язык программирования Си. М.: Фин. и стат., 1992.

2.    Керниган Б, Ритчи Д. Язык программирования Си. Задачи по курсу Си. М.: Фин.и стат., 1985.

3.    Уинер Р. Язык ТурбоСи. М.:Мир, 1991.

4.    Хинт К. Си без проблем. Руководство пользователя. М.: Бином, 1997.

Трофимов С.П. Программирование в Си. Организация ввод-вывода // Метод. указания, Екатеринбург, Изд-во УГТУ, 1998, 20 с.


Информация о работе «Динамическое распределение памяти»
Раздел: Информатика, программирование
Количество знаков с пробелами: 17156
Количество таблиц: 9
Количество изображений: 1

Похожие работы

Скачать
46448
0
0

... до тех пор, пока во время счета не выполнится вход в блок, и котором описан массив. При входе в блок вычисляются границы массива и производится обращение  к программе распределения памяти для массивов. Здесь же вносится в информационный вектор необходимая информация. Какая информация заносится в информационный вектор? Для предложенной выше n-мерной схемы нам как минимум нужны ...

Скачать
48910
4
3

... .) В системах, в которых страницы инструкций (в противоположность страницам данных) являются реентерабельными, бит изменения никогда не устанавливается. 2. Разработка алгоритма управления оперативной памятью Ниже приведён алгоритм управления оперативной памятью в системе Linux. В основе всего лежат страницы памяти. В ядре они описываются структурой mem_map_t. typedef struct page { /* ...

Скачать
80963
2
5

... производительность 1600 Мбайт/с на двухбайтной шине данных при частоте 400 МГц. Стандарт DRDRAM поддержан множеством производителей микросхем и модулей памяти, он претендует на роль основного высокопроизводительного стандарта для памяти компьютеров любого размера. Подсистема памяти (ОЗУ) DRDRAM состоит из контроллера памяти, канала и собственно микросхем памяти. По сравнению с DDR SDRAM при той ...

Скачать
22335
4
0

... . Несет информацию об адресе текущего элемента однонаправленного динамического списка. q – указатель на структуру news. Несет информацию об адресе последнего созданного элемента однонаправленного динамического списка. news *un,*p,*q; i – переменная типа int. Несет информацию о количестве элементов однонаправленного динамического списка. int i; 4 2) Локальные переменные процедуры ...

0 комментариев


Наверх