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

Функции для выделения и освобождения памяти

Функция

Прототип и краткое описание

malloc

void * malloc(unsigned s)

Возвращает указатель на начало области (блока) динамической памяти длиной в s байт. При неудачном завершении возвращает значение NULL.

calloc

void * calloc(unsigned n, unsigned m)

Возвращает указатель на начало области (блока) обнуленной динамической памяти, выделенной для размещения n элементов по m байт каждый. При неудачном завершении возвращает значение NULL.

realloc

void * realloc(void *bl, unsigned ns)

Изменяет размер блока ранее выделенной динамической памяти до размера ns байт. bl – адрес начала изменяемого блока. Если bl равен NULL (память не выделялась), то функция выполняется как malloc.

free

void * free(void *bl)

Освобождает ранее выделенный участок (блок) динамической памяти, адрес первого байта которого равен значению bl.

Остановимся детальнее на рассмотрении оператора

matrix = (int* )malloc (n*m*sizeof(int));

Функция malloc(unsigned s) возвращает указатель (void *) на начало области памяти, данные в которой имеют тип void.

Вначале нужно создать указатель на область памяти (int *matrix;) и использовать его для функции malloc. Для задания фактического типа возвращаемое значение необходимо преобразовать к нужному типу при помощи оператора преобразования типа. В противном случае компилятор выдаст сообщение об ошибке.

Тема № 5. Функции. Символьные строки и функции над ними Определение функций

В С определены три производных типа:

  • массив

  • указатель

  • функция.

Функцию следует рассматривать с двух точек зрения:

  • функция – это один из производных типов данных,

  • функция – это минимальный исполняемый модуль программы на языке С.

Все функции в языке С имеют следующий формат определения:

<тип> <имя_функции> (<спецификация параметров>)

<тело функции>

Здесь

<тип> -

  • void (для функций, не возвращающих значения),

  • обозначение типа возвращаемого функцией значения.

<имя_функции> -

  • main для основной (главной) функции программы,

  • произвольно выбираемое программистом имя (идентификатор).

<спецификация параметров> -

  • это либо пусто,

  • либо список формальных параметров, каждый элемент которого имеет вид:

<обозначение_типа> <имя_параметра>

По сравнению с уже известными способами определения формальных параметров, существует возможность завершения списка параметров запятой с последующим многоточием «, …». Это означает, что при обращении к функции может быть указано большее число фактических параметров. Так, известные функции printf и scanf имеют прототипы:

int printf (const char *format, …);

int scanf (const char *format, …);

Указанные функции позволяют применять теоретически неограниченное количество фактических параметров. Обязательным является только параметр char *format – «форматная строка», внутри которой с помощью спецификаций преобразования определяется реальное количество параметров, участвующих в обменах.

<тело функции> - это часть определения функции, представляющая программный блок, т.е. ограниченный фигурными скобками фрагмент текста на языке С, размещенный непосредственно вслед за заголовком функции. Особенность С состоит в невозможности внутри тела функции определить другую функцию: определения функций не могут быть вложенными.

Для завершения (прерывания) работы функции служит оператор return. Существует две формы этого оператора:

  • return; // Возврат без передачи результата

  • return <выражение>; // Возврат значения

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

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