Работа с динамической памятью с помощью библиотечных функций 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) с помощью операций new и delete ; 2) с помощью библиотечных функций malloc (calloc) и free.
- Дана последовательность целых чисел, количество которых заранее не определено. Считать концом последовательности ввод нулевого значения. Вывести на печать числа по закономерности, пока образуется пустая строка.
an an-1 ... a3 a2 a1
an-1 an-2 ... a2
..................
- Дана последовательность символов латинского алфавита, количество которых заранее не определено. Считать концом последовательности символ пробела. Вывести на печать гласные буквы из данной последовательности.
- Индивидуальные задания. Реализуйте решение данной задачи двумя способами:
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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!