Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_пяву_4.doc
Скачиваний:
101
Добавлен:
15.03.2015
Размер:
1.29 Mб
Скачать

Функция malloc

#include<stdlib.h> void* malloc(size_t size);

Эта функция предпринимает попытку динамически выделить непрерывный блок памяти, размер которого равен size_tбайт. В случае успеха функция возвращает указатель на начало выделенной памяти. В случае неуспеха функция вернет указательNULL. Следует учитывать, что после завершения работы с памятью, выделенной функциейmalloc(), ее следует освободить вызовом функцииfree().

В приведенном ниже примере делается попытка динамически выделить память для строкового буфера размером в MAXSIZEбайт. Если попытка закончится неудачей, то будет вызвана функция пользователяerror().

#include<stdlib.h>

#define MAXSIZE 129 intmain(void) {

char* buf;

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

error(); /* ..................*/ }

Функция calloc

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

#include<stdlib.h> void*calloc(size_t nmemb, size_t size);

Делает попытку выделить память для массива из nmembобъектов, размер каждого из которых равенsizeбайт. В случае успеха функцияcalloc() возвращает указатель на начало выделенной памяти. В случае неуспеха возвращается указательNULL. Выделенная память заполняется двоичными нулями.

#include<stdlib.h> #define MAXSIZE 129 intmain(void) {double* arr;int n;if(NULL ==(arr =сalloc(MAXSIZE))) error(); /* ..................*/ }

Функция realloc

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

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

Основное назначение функции realloc()состоит в изменении размера выделенной динамической памяти. Такое использование рассматриваемой функции имеет место при условии, что ее первый параметр (ptr) не равенNULL. В том же случае, когда значение параметраptrравноNULL, функцияrealloc()ведет себя подобно функцииmalloc().

Выполнение рассматриваемой функции в стандартах С89 и С99 несколько различаются, хотя конечный результат один и тот. Вначале рассмотрим работу этой функции в соответствии со стандартом С89. При использовании с параметром ptr, отличным от нуля, функцияrealloc(),делает попытку изменить размер объекта, на который установлен указательptr, до размера, определяемого значением параметраsize. Если содержимое нового и старого объекта имеет общую часть, то содержимое общей части остается неизменным. Если размер нового объекта превышает размер старого объекта, то содержимое новой области памяти неопределенно. В соответствии со стандартом С89 значение, возвращаемое функцией, может совпадать, а может и не совпадать со значением параметраptr. В соответствии со стандартом С99 функцияrealloc()должна освобождать старый блок динамической памяти и выделять новый блок. Поэтому значение, возвращаемое функциейrealloc() в соответствии с этим стандартом всегда отличается от значения параметраptr.

Приведем пример применения функции realloc(). Пусть в некоторой программе необходимо иметь массив, состоящий из “n” ‘элементов типаdouble. Предположим далее, что позже в зависимости от выполнения некоторых условий может потребоваться удвоение выделенной памяти для хранения элементов динамического массива. Ниже приведем фрагменты программного кода, которые решают задачу по выделению динамической памяти для рассматриваемой задачи.

#include<stdlib.h> intmain(void) {double* p = NULL;intn; /* */ p = malloc(sizeof(double) * n);if(!p) { puts(“Ошибка при выделении памяти”); exit(1); } /* */if(/* Проверка условия необходимости удвоения памяти */) { p = realloc(p, siztof(double) *2 * n);if(!p) { puts(“Ошибка при выделении памяти”); exit(1); } } /* */return 0; }