Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОС_ответы.doc
Скачиваний:
43
Добавлен:
27.10.2018
Размер:
21.59 Mб
Скачать

Int n; scanf("%d",&n); //число элементов в массиве

тип *имя;

имя=(тип*)malloc(n*sizeof(тип));

...

free(имя);

Пример 1. Создать динамический массив для чисел типа int, размер задать с клавиатуры, значения элементов ввести с клавиатуры.

#include <stdio.h>

#include <alloc.h>

Void 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);}

В этом примере функция malloc() осуществляет запрос у операционной системы n*sizeof(int) байт свободной памяти для размещения массива чисел типа int. При наличии свободной памяти возвращается указатель типа void* на начало выделенного блока памяти, иначе ‑ NULL. Дальше выполняется преобразование типа void* в тип int*. Далее в выделенную память помещаем значения элементов массива, причем, доступ к элементам массива можно осуществлять как с помощью индексов, так и методом разыменования указателей на элементы. В конце выполняется вызов функции free(), которая высвобождает выделенную ранее память.

При работе с массивом динамической памяти мы пользуемся указателем. Поэтому, если к нему применить операцию sizeof(), то в результате мы получим именно размер указателя (4 байта), а не размер массива, как в случае работы с обычным массивом. И, поскольку указатель – это переменная, то его значение можно менять, т.е. к нему применимы, например, операции инкремент и декремент.

Недостатком работы с массивами динамической памяти является невозможность их инициализации, поэтому всегда следует задавать начальные значения элементов массива явно с помощью операции присвоения. Среди библиотечных функций имеется функция calloc(), которая запрашивает память так же, как и функция malloc(), но в отличие от последней, функция calloc() заносит в ячейки выделенной памяти нулевые значения. Однако опытные программисты не рекомендуют доверять в этом случае компилятору, и для переносимости программ следует явно присваивать начальные значения элементам массива динамической памяти.

В следующем примере для выделения динамической памяти применена функция calloc(), которая обнуляет ячейки выделенной памяти. Обратите внимание на то, что эта функция имеет два аргумента, в отличие от функции malloc(). Первый аргумент задает количество необходимых элементов массива, второй – их размер. В данном примере использован удобный способ определения размера элементов: с помощью операции sizeof(), которая применена к разыменованному указателю. В случае изменения типа массива автоматически изменится и размер элемента в аргументе функции выделения памяти. В примере показаны разные формы доступа к элементам массива, а также один из способов генерации псевдослучайных чисел.

Повторим еще раз важные вещи для работы с массивами и указателями. Границы массивов динамической памяти, так же как и массивов фиксированного размера, не контролируются системой, программист сам должен отслеживать использование границ и длины массивов. В случае присвоения указателю, содержащему значение адреса начала массива динамической памяти, некоторого другого значения, блок выделенной памяти будет безвозвратно утерян. Даже высвободить его в дальнейшем будет невозможно, что, в конечном итоге, может привести к неоднозначному поведению программы или отказу операционной системы. Например:

for(i=0;i<n;i++)

{*p=rand()/double(RAND_MAX);

printf("p[%ld]=%lf\n",i,*p++);

}

В языке С++ для работы с динамическими массивами введены специальные операции new, delete, delete[]. Они аналогичны по действию функциям malloc() и free(), но проще по синтаксису. Операцию delete[] следует применять, если память выделена под массив, а операцию delete для высвобождения памяти, предоставленной для простых переменных. В современных руководствах по языку С++ не рекомендуется смешивать в программе использование функций malloc(), free() с операциями new, delete.

Синтаксис для создания одномерного динамического массива с помощью операции new такой

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]