Динамическое размещение данных
Если в задаче заранее неизвестно количество объектов и объект описан указателем, удобно использовать динамическое размещение данных.
Прототипы функций работы с динамической памятью находятся в библиотеке alloc.h, рассмотрим основные из них:
void *calloc(unsigned n, unsigned m); - возвращает указатель на начало области памяти для размещения n элементов по m байт каждый, при неудачном завершении возвращает значение NULL;
void *malloc(unsigned n); - возвращает указатель на блок памяти длиной n байт, при неудачном завершении возвращает значение NULL;
void *realloc(void *bf, unsigned n); - изменяет размер ранее выделенной памяти с адресом начала bf на n байт;
void free(void *bf); - освобождает ранее выделенный блок памяти с адресом bf;
coreleft(void); - возвращает значение объема неиспользованной памяти (тип возвращаемого результата unsigned – для моделей памяти tiny, small, medium; unsigned long – для других моделей памяти).
Пример выделения памяти для массива действительных чисел размером n:
float *x; // Указатель объекта типа float – x[0]
int n; // Количество элементов массива
. . .
x=(float*)calloc(n,sizeof(float)); // Захват памяти для n элементов
. . .
free(x); // Освобождение памяти
Пример работы со строковыми данными
Проверить, является ли введенная строка палиндромом (справа налево читается так же, как и слева направо).
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <calloc.h>
void main(void)
{
char *s; // Объявление строки указателем
int i, k;
clrscr();
puts(" Vvedi stroky"); gets(s);
k=strlen(s);
s=(char*)calloc(k,sizeof(char)); // Захват памяти для строки длиной k
for (i=0; i<(int)(k/2); i++)
if(s[i]!=s[k-i-1])
{
puts("\t\a NO!!");
getch();
free(s); // Освобождение памяти
return;
}
puts("\t\a YES - Pаlindrom!");
getch();
free(s); // Освобождение памяти
}
Пример динамического размещения одномерного массива
Ввести массив действительных чисел размером n и вывести на экран.
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<alloc.h>
void main()
{
int i,n;
float *a;
puts(“\n Введите размер массива n:”);
scanf(“%d”,&n);
printf(“\n Свободная память -%d”,coreleft());
a=(float*)calloc(n,sizeof(float)); // Захват памяти
printf(“\n Введите элементы массива a: \n”);
for(i=0; i<n; i++)
scanf(“%f”,(a+i)); // scanf(“%f”,&a[i]);
printf(“\n Массив a \n”);
for(i=0; i<n; i++)
printf(“ %6.3f \n“, a[i]);
printf(“\n Память после захвата -%d”,coreleft());
free(a); // Освобождение памяти
getch();
}