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

Функция Прототип и краткое описание
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; просмотров: 904;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

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

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.007 сек.