Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Функция free




Объявление этой функции имеет следующий вид

#include<stdlib.h>
void free(void * ptr);

Рассматриваемая функция предназначена для освобождения памяти, на которую установлен указатель ptr, Эта память должна быть предварительно выделена одной из следующих функций: calloc(), malloc() и realloc(). Если значение параметра ptr равно NULL, то функция free() никаких действий не выполняет. В противном случае, если указатель ptr не установлен на память, выделенную одной из функций, предназначенных для выделения динамической памяти, поведение функции free() не определенно. Значение указателя ptr после успешного освобождения памяти считается неопределенным, такие указатели относятся к категории недействительных указателей. Рекомендуется после освобождения памяти указателю ptr присваивать значение NULL.

Отметим, что функция free() не имеет средств, предназначенных для передачи информации о возникновении ошибки при освобождении памяти.

Рассмотрим пример применения функции free().

#include<stdlib.h>

#define MAXSIZE 129
int main(void)
{

char * buf;

if (NULL == (buf = malloc(MAXSIZE)))

error();
/*.................. */
/* Строка buf теперь не нужна */
free(buf);
buf = NULL;
/*.................. */
}

 

38.8. Указатели – параметры функций. Имитация передачи по ссылке

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

Пример 1 Обмен значений двух переменных.

Постановка задачи. Даны две переменные a и b типа double. Необходимо выполнить обмен значений этих переменных. Решение необходимо оформить в виде функции.

Решение.

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

void swap(double a, double b);

закончится неудачей. Вернуть обмен значений параметров a и b, выполненный в теле функции swap() не удается.

void swap(double *p1, double *p2)
{
double temp = *p1;
*p1 = *p2;
*p2 = temp;
}

// Клиентский код
int main(void)
{
double a = 2, b = 3;
swap(&a, &b);
}


Следует убедиться в том, что при использовании рассматриваемого варианта функции swap() обмен значений переменных a и b имеет место. Этого удалось достичь за счет того, что адреса этих переменных во время вызова рассматриваемой функции оказались записанными в парметры функции. В результате в теле функции swap() с помощью разыменования указателей осуществляется работа с памятью, выделенной в точке вызова. Обратимся, например, следующей инструкции, которая находится в теле функции swap()

*p1 = *p2;

Нетрудно убедиться в том, что эта инстукция работает с переменными a и b, которые находятся в клиентском коде, выполняя копирование переменной b в переменную a.

Пример 2 Обмен значений двух указателей.

Постановка задачи. Даны два указателя p1 и p1 типа double*. Решение необходимо оформиты в виде функции.

Решение.

void swap_pointers(double **p1, double **p2)
{
double* pt = *p1;
*p1 = *p2;
*p2 = *pt;
}

// Клиентский код
int main(void)
{

double a = 2;
double *pa = &a;
double b = 3;
double *pb = &b;

swap_pointers(&pa, &pb);
//..
}





Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 377; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.