Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык Си. Лабораторные работы / Справочник. Часть 2 (СПбГУТ).doc
Скачиваний:
47
Добавлен:
10.09.2019
Размер:
801.79 Кб
Скачать

Функция realloc

Прототип этой функции имеет следующий вид.

#include<stdlib.h> void* realloc(void* ptr, size_t size);

Функция изменяет размер блока памяти, на который установлен указатель ptr, до size байт. Содержимое блока в области памяти, меньшей из двух величин – старой и новой остается неизменным. Функция возвращает указатель на новое положение выделенного участка памяти, который может быть перемещен. При невозможности перераспределить память возвращает NULL. Если ptr равно NULL, рассматриваемая функция ведет себя подобно фукции malloc с аргументом size. Если size равно нулю, а указатель ptr не равен NULL, функция ведет себя подобно функции free(). После завершения работы с выделенной памятью ее следует освободить вызовом функции free().

Функция free

Прототип этой функции имеет следующий вид.

#include<stdlib.h

void free(void* ptr);

Функция освобождает динамическую память, на которую установлен указатель ptr. Если ptr == NULL, то функция ничего не делает. Если ptr не является указателем на динамическую память, то поведение функции не определено. Значение ему после выполнения функции не определенно, поэтому рекомендуется после ее вызова ptr присваивать значение NULL.

1.37.3. Указатели и квалификатор const

Квалификатор const может относиться к объекту, на который установлен указатель, или к самому указателю. Если в определении указателя квалификатор находиться слева от * то константным является объект, а если справа от * – константным будет указатель. В одном определении указателя можно написать два квалификатора const; один слева от символа *, а другой справа. Тогда константными будут как объект, так и указатель.

Пример 1. Указатель на константный объект

int n = 5; const int* pi = &n; // указатель на константный объект типа int

int const * pi = &n; // альтернативное определение // указателя на константный объект типа int

int m = *pi;

//*pi = 10; pi = &m;

Здесь pi – указатель на константный объект. В качестве константного объекта для этого указателя выступает переменная n. При компиляции закомментированной строки появляется сообщение об ошибке. Таким образом, записать новое значение в переменную n, используя указатель, невозможно. С другой стороны, вполне допустимо изменение самого указателя (см. последнюю строку приведенного выше кода).

Пример 2. Константный указатель на неконстантный объект

int n = 5; int* const pi = &n; int m = *pi; *pi = 10; //pi = &m;

Здесь pi – константный указатель на неконстантный объект. С объектом такой указатель работает как обычный указатель. Значение же адреса, которое получено указателем во время обязательной инициализации, изменено быть не может (см. закомментированную строку)

Пример 3. Константный указатель на константный объект.

int n = 5; const int* const pi = &n; //*pi = 20; int m = 10; //pi = &m;

Здесь pi – константный указатель на константный объект. Для такого указателя недопустимы операции изменения, как объекта, так и самого указателя (см. закомментированные строки).