Работа с динамической памятью с помощью библиотечных функций malloc (calloc) и free



Средства для динамического выделения и освобождения памяти описаны в заголовочных файлах malloc.h и stdlib.h стандартной библиотеки (файл malloc.h ).

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

Функция Прототип и краткое описание
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 "stdafx.h"#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ 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); //освобождает память system("pause"); return 0;}

В программе int n – количество вводимых чисел типа float, float* t – указатель на начало области, выделяемой для размещения n вводимых чисел. Указатель t принимает значение адреса области, выделяемой для n значений типа float. Доступ к участкам памяти выделенной области выполняется с помощью операции индексирования: t[i] и t[i-1]. Оператор free(t); содержит вызов функции, освобождающей выделяемую ранее динамическую память и связанной с указателем t.

Задания для выполнения

  1. Составьте программу нахождения действительных корней квадратного уравнения, расположив его коэффициенты в динамической памяти.
  2. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Ввести и напечатать на разных строках четные и нечетные числа данной последовательности. Реализуйте данную программу двумя способами: 1) с помощью операций new и delete ; 2) с помощью библиотечных функций malloc (calloc) и free.
  3. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Вывести на печать числа по закономерности, пока образуется пустая строка.

an an-1 ... a3 a2 a1

an-1 an-2 ... a2

..................

  1. Дана последовательность символов латинского алфавита, количество которых заранее не определено. Считать концом последовательности символ пробела. Вывести на печать гласные буквы из данной последовательности.
  2. Индивидуальные задания.  Реализуйте решение данной задачи двумя способами:
    1) с помощью операций new и delete ;
    2) с помощью библиотечных функций malloc (calloc) и free.
Вариант Задание
1. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти разность нечетных элементов в списке.
2. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти сумму четных элементов в списке.
3. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти разность элементов в списке, стоящих на нечетных местах.
4. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти сумму элементов в списке, стоящих на четных местах.
5. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти минимальный положительный элемент в списке.
6. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти максимальный отрицательный элемент в списке.
7. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти произведение элементов списка.
8. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Определить, каких элементов в списке больше положительных или отрицательных.
9. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти сумму максимального и минимального элементов в списке.
10. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти среднее геометрическое элементов в списке, стоящих на нечетных местах.
11. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти среднее геометрическое элементов в списке, стоящих на четных местах.
12. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти среднее арифметическое элементов в списке, стоящих на нечетных местах.
13. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти среднее арифметическое элементов в списке, стоящих на четных местах.
14. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти среднее гармоническое элементов списка.
15. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти минимальный элемент в списке, стоящий на нечетном месте.
16. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти разность минимального и максимального элементов в списке.
17. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти минимальный элемент в списке, стоящий на четном месте.
18. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти максимальный элемент в списке, стоящий на нечетном месте.
19. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти максимальный элемент в списке, стоящий на четном месте.
20. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти количество отрицательных элементов в списке.
21. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти количество положительных элементов в списке.
22. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти среднее геометрическое элементов в списке.
23. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти среднее арифметическое элементов в списке.
24. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти минимальный элемент в списке.
25. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти максимальный элемент в списке.
26. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти разность между максимальным и минимальным элементами в списке.
27. Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Найти сумму положительных нечетных элементов в списке.

 


Дата добавления: 2021-07-19; просмотров: 65; Мы поможем в написании вашей работы!

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






Мы поможем в написании ваших работ!