Работа с динамической памятью
В языке С размерность массива при объявлении должна задаваться константным выражением. При необходимости работы с массивами переменной размерности вместо массива достаточно объявить указатель требуемого типа и присвоить ему адрес свободной области памяти (захватить память). После обработки массива занятую память надо освободить. Библиотечные функции работы с памятью описаны в файле alloc.h.
Пример создания динамического массива:
float *x;
int n;
printf("\nРазмерность - "); scanf(" %d",&n);
if ((x = calloc(n, sizeof(*x)))==NULL) { // Захват памяти
printf("\n Предел размерности “);
exit(1);
}
else {
printf("\n Массив создан !");
...
for (i=0; i<n; i++)
printf("\n%f",x[i]);
...
free(x); // Освобождение памяти
}
В С++ введены две операции: захват памяти - new, освобождение, захваченной ранее памяти - delete.
Общий формат записи:
указатель = new type (значение);
. . .
delete указатель;
Например:
int *a;
a = new int (8);
В данном случае создана целочисленная динамическая переменная, на которую установлен указатель a и которой присвоено начальное значение 8. После работы с ней освобождаем память:
. . .
delete a;
Операции new и delete для массивов:
указатель = new тип [количество] ;
Результат операции – адрес начала области памяти для размещения данных, указанного количества и типа. При нехватке памяти – результат NULL. Операция delete:
delete [ ] указатель;
13.1. Пример создания одномерного динамического массива:
Массив объявляем указателем.
...
double *x;
int i, n;
...
puts(" Введите размер массива: ");
scanf(“%d”, &n);
x = new double [n] ;
if (x == NULL) {
puts(" Предел размерности ! ");
return;
}
for (i=0; i<n; i++) // Ввод элементов массива
scanf(“%lf”, &x[i]);
...
delete [ ]x; // Освобождение памяти
...
13.2. Пример создания двуxмерного динамического массива:
Напомним, что ID двухмерного массива - указатель на указатель (рис. 4):
...
int **m, n1, n2;
puts(" Введите размеры массива (количество строк и столбцов: ");
scanf(“%d%d”, &n1, &n2);
m = new int * [n1]; // Захват памяти для указателей - А (n1=3)
for ( int i=0; i<n1; i++) // Захват памяти для элементов - B (n2=4)
m[i] = new int [n2];
. . .
for ( i=0; i<n1; i++)
for ( j=0; j<n2; j++)
m[i] [j] = i+j; // *(*(m+i)+j) = i+j;
. . .
for ( i=0; i<n1; i++) // Освобождение памяти
delete [ ] m[i];
delete [ ] m;
. . .
Дата добавления: 2015-09-11; просмотров: 730;