Пример использования динамической памяти
В следующем примере динамическая память используется для хранения элементов массива заранее неопределенного размера, ввод которого прекращается при появлении во входном потоке числа больше или равного 1e300. При этом, вначале под массив выделяется сегмент памяти, максимального размера, затем размер блока памяти устанавливается соответствующим фактическому размеру массива.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <malloc.h>
#include <limits.h>
void * Malloc( size_t size )
{
void *p = malloc(size);
if( !p )
{ printf("Недостаточно памяти!\n"); exit(1); }
return p;
}
void * Realloc ( void *block, size_t size )
{
void *p = realloc(block, size);
if( !p ) { printf("Недостаточно памяти!\n"); exit(1); }
return p;
}
void main(void)
{
double *A, temp;
unsigned i, n, maxN, goodIO;
A = (double *) Malloc( maxN = UINT_MAX );
maxN /= sizeof(double);
for(goodIO = n = 0; n < maxN; n++)
{
printf("A[%d] = ", n); scanf("%lf", &temp);
if(temp >= 1e300) { goodIO = 1; break; }
A[n] = temp;
}
if(goodIO)
{
A = (double *) Realloc(A, n * sizeof(double));
/* Обработка массива. Для примера - печать. */
for(i = 0; i < n; i++)
{
printf("%10.3lf ", A[i]);
if( (i + 6) % 5 == 0 ) printf("\n");
if( (i + 121) % 120 == 0 ) { getch(); clrscr(); }
}
printf("\n");
}
free(A);
}
Максимальный размер сегмента в байтах всегда равен величине наибольшего беззнакового целого числа, значение которого определяет константа UINT_MAX из заголовочного файла <limits.h>.
В программе используются вспомогательные функции Malloc() и Realloc() для обеспечения контроля выделения памяти. В них функция exit() с прототипом в файле <stdlib.h> используется для прерывания работы программы.
Дата добавления: 2015-02-13; просмотров: 779;