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

1. Проблемы распределения памяти. В современном языке программирования существует 3-и способа распределения памяти:1)статическое2)автоматическое3)динамическоеПри любом распределении память выделяется под данные программы. Соответственно сточки зрения размещения в памяти все данные также можно разделить на 3 категории :1)статическое размещение данных 2)автоматическое размещение данных 3)динамическое размещение данных. Любые данные программы характеризуются 2-я свойствами:1)область взаимодействия 2)время жизни1- основывается в основном определении права доступа к данным из той или иной функции программы.2- определяет какое время это данное доступно для программы т.е. сколько оно хранится в ОП.С точки зрения распределения памяти главным является время жизни, т.к. именно оно определяет сколько времени тот или иной кусок памяти занимает конкретное данное.Эффективность работы достигается :1)выбора грамотного алгоритма –алгоритм решающий задачу за наименьшее число шагов2)доступ к данным за минимальное время - 3)хорошо спроектированная лог. модель 4)грамотно реализованная физическая модель (на чем хранить итд.)Также проблема фрагментации т.е. когда память разбита на много блоков, это требует длительного поиска

2. Существующие способы распределения памяти. В любом языке программирования существует 3 типа распределения памяти: 1)статический2)автоматический 3)динамический.При любом способе распределения памяти она выделяется под данные или под объекты программы, с точки зрения размещения в памяти все данные также можно разделить на 3 категории: статически размещаемые данные, автоматически размещаемые данные, динамически размещаемые данные.

3. Статическое распределение памяти. Преимущества и недостатки. В статическом распределении памяти под данные выделяется память на все время работы программы. Она освобождается после окончания работы программы. В Си статически размещенные данные представлены глобальными данными т.е. данными определенными во всей функции. Недостаток – негибкость стратегии управления памятью, т.е. нужно определять сколько памяти нужно выделить.

4. Автоматическое распределение памяти. Преимущества и недостатки. В автоматическом распределении памяти память под данные выделяется и освобождается автоматически в процессе работы программы. В Си автоматическое размещение данных представлено локальных данными, т.е. данными, размещенными внутри любой функции. Под данные с одним и тем же именем течении времени работы программы память может выделяться несколько раз Недостаток – негибкость стратегии управления памятью, т.е. нужно определять сколько памяти нужно выделить, т.е. процесс управления автоматическими данными практически определяется порядком вызова функции.

5. Динамическое распределение памяти. Особенности динамического распределения памяти.Преимущества и недостатки. При динамическом распределении, выделением и освобождением памяти управляет сама программа в процессе своей работы. Время жизни динамически распределенных данных определяется самой программой в процессе ее выполнения. В отличии от заранее определенных данных количество динамических данных жестко не фиксировано. Если программе потребуется динамическое распределение данные она может получить и распределить память под него.Они имеют особенности: 1)эти данные в отличии заранее определены, не имеют имен и доступ осуществляется с помощью указателей 2)память выделяется не во время компиляции, а во время работы.

6.Преобразование указателя типа void в языке С.Нет ни набора допустимых значений, ни набора операций => нет смысла и возможности описания переменных типа void. Т.к. нет значений, которые им можно присвоить. Введен для выполнения специальных функций:1)Для указания, что функция не возвращает никаких значений

Void_имя функции_ (аргументы)2)Для указ, что функции не передаются никакие аргументы

Тип_ имя ф-ункции (void)3)Для объявления указателя на тип void

Void *z ; Определяет указатель z, который указывает на тип данных void. Для работы с указателем *z, нужно его преобразовать. Величина типа указателя на void может быть преобразована к величине любого другого указательного типа.

int x; (int *)z = px;

float y; (float *)z = py;

void *z;

int * px;

float *py;

px = &x;

py = &y;

Указатель z указывает не на адрес какого-то конкретного объекта программы, а просто на адрес памяти, по который может храниться любой объект некоторого. типа. Поэтому называется адресным указателем.

7. Средства языка Си для динамического распределения памяти. Для работы с динамическим распределение памяти в Си существует ряд функций, которые описаны в библиотеке stdlib. Моменты выделения и освобождения памяти в языке Си определяются программистом. Программист должен выдать запрос на выделение/освобождение памяти при помощи стандартной процедуры/функции – malloc, calloc, realloc /free. Программист зачастую должен определить также и адрес выделяемой области.

8. Использование указателя типа void в качестве значения, возвращаемого функцией.Часто функции возвращают указатель типа void. Пусти имеется некоторая функция f1. Вызывающая функция возвращает адрес (указатель типа void). Вызывающая функция берет содержимое по этому адресу и интерпретирует по своему усмотрению

Main()

..

{ int *px;

Float *py;

px = (int*)f1(…)

py = (float*)f1(…)

}

Void *f()

{…}

Вызывающей функцией main делается преобразование указателя типа void, тем самым сразу задаем количество ячеек памяти, которые может рассматривать, начиная с ячейки на которую указывает указатель. Содержимое выделенных ячеек сразу интерпретируют как данное того типа, к которому преобразуется указатель типа void. Такая возможность для написания однотипных функций возвращающих указатели на разных типах данных.

Main ()

{int *px;

Float *py;

Char *pz;

Px = f1();

Py = f2();

Int *f1()

{…}

Float *f2()

{…}

Char *f3()

{…}

9. Функция malloc. Примеры использовании.

Void *malloc (msigned int size)

Динамически распределяет блок памяти размером как минимум size байтов. В качестве своего значения возвращает указатель на выделенную область памяти, начинающуюся на границе слова. При выделении блока памяти происходит его выравнивание для размещения объектов любого типа. Инициализация нулём не производится.

line = (char*)malloc(sizeof(char));

if(line==NULL){printf("\n\nErorr!");}

10. Функция сalloc. Примеры использования.

Void *сalloc (unsigned int nelem, unsigned int elsize)

Где nelem - число элементов, для которые необходимо выделить память, elsize - объем памяти, который необходимо выделить для каждого элемента.

Динамическое распределение. Область памяти для массива из nelem элементов, каждый из которых занимает объем памяти равный elsize. В качестве своего значения возвращает указатель на 1ый элемент массива. Он выравнивается.

char *line = (char*)calloc(100, sizeof(char));

if(line==NULL){ printf("\n\nErorr!");}

11. Функция realloc. Примеры использования.

Функция realloc – изменения размера под динамические данные.Когда размер блока динамически распределенной памяти с использованием функции malloc или calloc становится мал, то изменяем с помощью realloc.

Void realloc (ptr, size); Значение аргумента ptr определяет адрес области памяти, для который необходимо увеличить размер.Значение аргумента size задает новый размер области в байтах.

Работает след. образом:1)По указателю ptr происходит обращение к расширяемому блоку памяти.2)Содержимое копируется по адресу нового выделенного блока, если по старому адресу невозможно выделить блок памяти требуемого размера. В качестве своего значения возвращает указатель на выделенный блок памяти.

buffer = (long *)malloc( 1000 * sizeof( long ) ))

……

buffer = realloc( buffer, size + (1000 * sizeof( long )) )

Malloc, calloc, realloc возвращают значение указателя равное 0, если память не выделяется (нет свободной памяти требуемого размера) Необходимо каждый раз проверять возвращаемое ими значение на 0 и если функции возвратили нулевой указатель, то необходимо выдать сообщение о том, что память не выделилась.

12. Функция free. Примеры использования.Функция free – освобождение памяти, выделенной под динамически размещенное данное.Не возвращает никаких значений. Если значение указателя, под который освобождается память, указывает на блок памяти, который не выделялся функциями malloc, calloc, realloc, то это может привести к ошибкам, которые трудно обнаружить и исправить.

13. Создание и организация работы с односвязным списком средствами языка Си.

Доступ к след: cur->next;к данным cur->data

14. Удаление элемента из односвязного списка в программе на языке Си.

delptr=cur->next;

cur->next = delptr->next;

free(delptr);

15. Статическое распределение памяти. Преимущества и недостатки.

16. Создание и организация работы с двусвязным списком в программе на языке Си.

Доступ к след: cur->next;пред, cur->prev;к данным cur->data