Читайте также:
|
|
...
free(имя_указ); // освобождение памяти
Функция malloc() запрашивает у ОС свободную память для массива чисел заданного типаразмером n*sizeof(тип_указателя) байт. При наличии свободной памяти возвращается указатель типа void* с адресом начала выделенного блока памяти, иначе ‑ NULL. Далее выполняется преобразование указателя типа void* в заданный тип. Доступ к элементам динамического массива можно осуществлять как с помощью индексов, так и методом разыменования указателей на элементы. В конце вызывается функция free(), которая высвобождает выделенную ранее память.
Пример 1. Создать динамический массив для чисел типа int, размер задать с клавиатуры, значения элементов ввести с клавиатуры.
int main()
{int n, *ptr;
puts("Введите размер массива");
scanf("%d",&n); // ввод размера массива
ptr=(int*)malloc(n*sizeof(int)); // запрос памяти под массив
if(ptr==NULL) // проверка выделения памяти
{puts("Ошибка выделения памяти!"); return -1;}
puts("Введите элементы массива");
for(int i=0;i<n;i++) scanf("%d",&ptr[i]);
puts("Введенный массив");
for(i=0;i<n;i++) printf("%d\n",*(ptr+i));
free(ptr); // освобождение памяти
return 0;}
Недостатком работы с массивами динамической памяти является невозможность их инициализации, поэтому всегда следует задавать начальные значения элементов массива явно с помощью операции присвоения. Имеется функция calloc(), которая запрашивает память так же, как и функция malloc(), но в отличие от последней, функция calloc() заносит в ячейки выделенной памяти нулевые значения.
В следующем примере для выделения динамической памяти применена функция calloc(), которая обнуляет ячейки выделенной памяти.
имя_указ=(тип*)сalloc(n,sizeof(тип)); // запрос памяти под массив
Функция сalloc() имеет два аргумента. Первый аргумент задает количество необходимых элементов массива, второй – их размер.
Пример 2 Создается динамический массив для чисел типа double, размер задается с клавиатуры, значения элементов – случайные числа 1.0
int main()
{long n,i,j;
puts("Введите размер массива");
scanf("%ld",&n); // ввод размера массива
double*p, sum=0.0;
p=(double*)calloc(n,sizeof(double)); // запрос памяти под массив
if(p==NULL) // проверка выделения памяти
{printf("Ошибка выделения памяти!\n"); return -1;}
srand((unsigned)time(NULL)); // запуск генератораслучайных чисел
for(i=0;i<n;i++)
{*(p+i)=rand()/double(RAND_MAX); // Случайные числа < 1.0
printf("p[%ld]=%lf\n",i,p[i]); // вывод на экран
}
free(p); // освобождение памяти
return 0;}
В языке С++ для работы с динамическими массивами введены специальные операции new, delete, delete[]. Операцию delete[] следует применять, если память выделена под массив, а операцию delete для высвобождения памяти, предоставленной для простых переменных.
Синтаксис для создания динамического массива с помощью операции new:
int n; scanf("%d",&n); // ввод количества элементов в массиве
тип *имя_указ; // определение указателя заданного типа
имя_указ=new тип[n];// запрос памяти под элементы массива
if(имя_указ==NULL) // проверка выделения памяти
{puts("Ошибка выделения памяти!"); return -1;}
...
delete[]имя_указ; // освобождение памяти
Пример 3 Создать динамический массив для чисел типа long, размер задать с клавиатуры, в него записать целые степени двойки, вывести на экран и освободить память.
int main()
{ long *arr;
long mul=1L; int n,i,j;
puts("Введите размер массива");
scanf("%d",&n); // ввод размера массива n=10
arr=new long[n]; // запрос памяти под элементы массива
if(arr==NULL) return -1;
for(i=0;i<n;i++)
{for(j=0;j<i+1;j++) mul*=2; // степени 2
arr[i]=mul;
mul=1L;
}
for(i=0;i<n;i++)
printf("arr[%d]=%ld\n",i,arr[i]); // вывод массива на экран
delete [] arr; // освобождение памяти
return 0;
}
На экран выведется:
arr[0]=2
arr[1]=4
arr[2]=8
arr[3]=16
arr[4]=32
arr[5]=64
arr[6]=128
arr[7]=256
arr[8]=512
arr[9]=1024
Обратите внимание пустые квадратные скобки при освобождении памяти, при этом освобождается память, выделенная под весь массив:
delete [] arr;
Если записать без квадратных скобок: delete arr;
то освобождается память, выделенная под одну переменную (объект).
Дата добавления: 2015-11-16; просмотров: 35 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Понятие жизни. Натуралистические и антинатуралистические исследовательские программы. | | | Матрицы и определители |