Динамическое размещение данных

Если в задаче заранее неизвестно количество объектов и объект описан указателем, удобно использовать динамическое размещение данных.

Прототипы функций работы с динамической памятью находятся в библиотеке 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();

}