Функции выделения и освобождения памяти
Функция | Прототип и краткое описание |
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. |
Функции malloc(), calloc() и realloc() динамически выделяют память в соответствии со значениями параметров и возвращают адрес начала выделенного участка памяти. Для универсальности тип возвращаемого значения каждой из этих функций есть void *. Этот указатель можно преобразовать к указателю любого типа с помощью операции явного приведения типа (тип *).
Функция free() освобождает память, выделенную перед этим с помощью одной из трех функций malloc(), calloc() или realloc(). Сведения об участке памяти передаются в функцию free() с помощью указателя – параметра типа void *. Преобразование указателя любого типа к типу void * выполняется автоматически, поэтому вместо формального параметра void *bl можно подставить в качестве фактического параметра указатель любого типа без операции явного приведения типов.
Пример 2. Ввести и напечатать в обратном порядке набор вещественных чисел, количество которых заранее не фиксировано, а вводится до начала ввода самих числовых значений.
#include <stdio.h>
#include <stdlib.h>
void main() {
float* t; //Указатель для выделяемого блока памяти
int i,n;
printf("n=");//n - число элементов
scanf("%d", &n);
t=(float *)malloc(n*sizeof(float));
for (i=0; i<n; i++){ //цикл ввода чисел
printf("x[%d]=",i);
scanf("%f", &t[i]);
}
//цикл печати результатов
for (i=n-1; i>=0; i--){
printf("\nx[%d]=%f",i,t[i]);
}
free(t); //освобождает память
}
В программе int n – количество вводимых чисел типа float, float* t – указатель на начало области, выделяемой для размещения n вводимых чисел. Указатель t принимает значение адреса области, выделяемой для n значений типа float. Доступ к участкам памяти выделенной области выполняется с помощью операции индексирования: t[i] и t[i-1]. Оператор free(t); содержит вызов функции, освобождающей выделяемую ранее динамическую память и связанной с указателем t.
Перед компиляцией кода в среде MSVC++ необходимо в меню Options/Project отключить режим Use Microsoft Foundation Classes.
Задания
1.Наберите код программы из Примера 1. Выполните компиляцию и запуск программы.
2.Составьте программу нахождения корней квадратного уравнения, расположив его коэффициенты в динамической памяти.
3.Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Ввести и напечатать на разных строках четные и нечетные числа данной последовательности. Реализуйте данную программу двумя способами: 1) с помощью операций new и delete; 2) с помощью библиотечных функций malloc (calloc) и free.
Домашние задания
1.Наберите код программы из Примера 2. Выполните компиляцию и запуск программы.
2.Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Вывести на печать числа по закономерности, пока образуется пустая строка.
an an-1 ... a3 a2 a1
an-1 an-2 ... a2
………………
3.Дана последовательность символов латинского алфавита, количество которых заранее не определено. Считать концом последовательности символ пробела. Вывести на печать гласные буквы из данной последовательности.
Дата добавления: 2015-02-16; просмотров: 948;