Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Лекция 12. Управление данными в heap-памяти




Библиотечные функции распределения heap-памяти

Библиотечные функции управления heap-памятью следующие (alloc.h, stdlib.h):

malloc - выделение памяти размером size байт.

Определение: char * malloc (unsigned size)

calloc - выделение памяти размером nelem * elsize и очистка ее.

Определение: char * calloc (unsigned nelem, unsigned elsize)

realloc - изменение размера ранее выделенной памяти.

Определение: char,* realloc (char * ptr, unsigned size)

free – освобождение ранее выделенной памяти.

Определение: void free (ptr)

char * ptr;

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

Пример

double *ptr;

if((ptr = (double *)calloc(100, sizeof(double))!= NULL)

{ Работа с массивом на 100 элементов типа double }

else

printf(“Память под массив не выделена.”\

“ Смените модель памяти и повторите компиляцию!\n”);

……………………………………………………………

Размещение массивов в heap-памяти

Массивы произвольной размерности и любым заданным числом элементов по каждому из измерений могут размещаться в heap-памяти. Необходимо только правильно сформировать запрос на выделение памяти (аргументы функций malloc или calloc) и в процессе работы с массивом организовать пересчет индексов в единственный индекс для вектора.

Пример

Работа с матрицей произвольного размера.

………….

double *A;

A=(double*)malloc(m x n x sizeof(double));

if (A==NULL) exit(0); /* в stdlib.h*/

……………..

test1 (A,m,n);

Здесь размерность m на n считывается из входного потока.

void test1(double *pt, int m, int n)

{

int i, j;

…………..

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

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

printf(“%d, %d, %f\n”, i, j, *(pt + i*n + j));

}

m – число элементов по первому измерению, нужно для цикла и контроля границ индекса.

n - число элементов по второму измерению (участвует в пересчете индекса в указатель).

Точно так же для 3-х измерений. Число элементов по 2-му и 3-му измерениям участвуют в пересчете индексов, а число элементов по 1-му – нет (Лекция 8).






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных