Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Пример 2 Создается динамический массив для чисел типа double, размер задается с клавиатуры, значения элементов – случайные числа 1.0

Читайте также:
  1. BITMAPFILEHEADER – эта структура содержит информацию о типе, размере и представлении данных в файле. Размер 14 байт.
  2. Boot (англ. загрузка. Пример: основной загрузочный сектор) -вирусы
  3. Cвойства стандартных элементов управления
  4. D.1. Примеры уязвимостей
  5. I. Условные обозначения
  6. Ii) Указатели на элементы массива
  7. II. Критерии для назначения повышенной стипендии

...

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 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Понятие жизни. Натуралистические и антинатуралистические исследовательские программы.| Матрицы и определители

mybiblioteka.su - 2015-2024 год. (0.02 сек.)